Как может я вызывать разархивировать / zip для не создания подкаталога, когда я извлекаю ее?

Капитал W не происходит в конце слова также, но он может произойти в сокращении всех заглавных букв. Таким образом, я заменил бы W когда это сразу после строчной буквы, или когда это следует за прописной буквой и предшествует строчной букве (aWre).

sed -e 's/\([[:lower:]]\)W/\1fi/g' -e 's/\([[:alpha:]]\)W\([[:lower:]]\)/\1fi\2/g'

Это не покрывает fifi (который мой самый большой список слов только находит им в “fifing”). Что еще более важно, это не покрывает W в начале слова; можно получить некоторые случаи путем рассмотрения второй буквы, но это все еще собирается пропустить много слов, которые начинаются fi. На английском языке много букв никогда не появляются после W:

… -e 's/\([^[:alnum:]]\)W\([b-dfgj-npqstv-xz]\)/\1fi\2/g' \
  -e 's/^W\([b-dfgj-npqstv-xz]\)/fi\2/'

Для более точных результатов и справляться с другими языками, можно переключиться на более сложный основанный на словаре подход (которым кажется, что Системы оптического распознавания часто используют, очевидно Ваш не достаточно необычен).

19
10.04.2017, 22:35
6 ответов

Используйте файловую систему FUSE, которая позволяет Вам просматривать архивы как каталоги, такие как AVFS. Использовать cp извлечь файлы к каталогу по Вашему выбору.

mountavfs
cp -Rp ~/.avfs/tmp/omeka-1.5.1.zip\#/omeka-1.5.1 omeka

Так как мы предполагаем, что существует единственный каталог верхнего уровня в архиве, можно сократить это к

cp -Rp ~/.avfs/tmp/omeka-1.5.1.zip\#/* omeka
4
27.01.2020, 19:45
  • 1
    @Giles Вы - эксперт, который приезжает и отвечает на все вопросы, на которые никто больше не может ответить, таким образом, я предполагаю это, является действительно единственным способом сделать это. Я надеялся unzip имел некоторое волшебство сделать это, такое как определение файлов, которые будут извлечены как */*, то, что я мог использовать, не устанавливая другую утилиту, но я предполагаю нет.Спасибо. +1 –  cwd 09.05.2012, 05:05

Если Ваш zip-файл не содержит структуры каталогов, или Вы не должны сохранять его, можно использовать это:

cd /tmp
wget http://omeka.org/files/omeka-1.5.1.zip
unzip -j omeka-1.5.1.zip -d omeka
cd omeka
ll
6
27.01.2020, 19:45
[116633] Этот скрипт не является робастным, но работает в простых случаях:

  • Он просто проверяет, есть ли ровно один подкаталог, и если да, то перемещает из него все вверх, а затем удаляет его.[116636].

  • 3
    27.01.2020, 19:45
    [119351]Я только что зарегистрировался сегодня, так что я не могу изменить @SteveBennet ответ и не могу добавить туда комментарий.[12182]На основании его ответа я создал рекурсивную функцию типа этой:[12183]Так же как @SteveBennet сказал: этот скрипт не робастный, а работает в простых случаях.[12184]Надеюсь, он будет полезен.[119358]
    2
    27.01.2020, 19:45

    Нужна опция типа patch --strip=n

    Желательно иметь опцию типа patch --strip=number (или -pnumber), которая сокращает number компоненты пути в начале (см. Сравнение и слияние файлов: патчи каталогов).

    Другое решение, применимость

    Если этого не произошло, есть еще одно решение, немного хакерское, но работающее. В моем случае я хотел перезаписать каталог, полный существующих файлов, содержимым zip, не распаковывая сначала полный zip.

    Когда это решение будет работать и будет доступно решение @Gilles, последнее тоже будет работать. Тем не менее, это решение не требует наличия файловой системы FUSE.

    Как это сделать

    Предполагая, что вы знаете дополнительный каталог, в вашем случае omeka-1.5.1, вы можете сделать следующее:

    mkdir omeka
    ln -s . omeka/omeka-1.5.1 # create a symlink that redirects output
    unzip omeka-1.5.1.zip -d omeka/
    rm omeka/omeka-1.5.1 # remote symlink
    

    unzip попытается разархивировать в omeka-1.5.1, который на самом деле является симлинком на содержащий dir. В результате файлы попадут непосредственно в omeka.

    Возможные варианты

    Вы можете придумать варианты для перенаправления одной или нескольких частей иерархии depeer.

    ln -s ../myfoo omeka/omeka-1.5.1/foo
    ln -s ../../mybarxyzzy omeka/omeka-1.5.1/subdir/bar
    

    Заключение

    Это решение несколько специфично, однако оно имеет свои сценарии использования, и я просто случайно использовал его.

    1
    27.01.2020, 19:45

    Скорее всего, вы захотите запустить unzip с параметром -j , например:

    unzip -j files.zip -d ./output/
    

    Но вы можете быть удивлены его поведением:

    -j junk paths . Структура каталогов архива не воссоздается; все файлы помещаются в каталог извлечения (по по умолчанию, текущий).

    Если вы извлечете files.zip в выходной каталог ./ output и получите в результате:

    ./output/files/subfolder1/f1
    ./output/files/subfolder1/f2
    

    , то параметр -j будет дать вам это (все пути отмечены полосами):

    ./output/f1
    ./output/f2
    
    0
    27.01.2020, 19:45

    Теги

    Похожие вопросы