Команда Zip без включения самого сжатого каталога

Предположим структуру:

/foo/bar/
        --file1
        --file2
        --file3
        --folder1
          --file4
        --folder2
          --file5

Я хочу запустить утилиту unix zip, сжав папку bar и все его файлов и подпапок из папки foo, но не иметь папки bar внутри zip, используя только командную строку.

Если я попытаюсь использовать аргумент -j, он не создаст папку bar внутри zip, как я хочу, но не создаст folder1 и folder2. Выполнение -rj не работает.

(Я знаю, что могу войти внутрь бара и сделать zip -r bar.zip .. Я хочу знать, можно ли выполнить то, что $/foo/bar/ zip -r bar.zip ., но делая это из $/foo).


person Somebody still uses you MS-DOS    schedule 02.09.2010    source источник


Ответы (3)


zip не имеет команды -C (сменить каталог), как tar

ты можешь сделать:

cd folder1 && zip -r ../bar.zip *

из оболочки командной строки

или вы можете использовать bsdtar, который представляет собой версию tar из libarchive, которая может создавать zip-файлы.

bsdtar cf bar.zip --format zip -C folder1 .

(это создает папку с именем ./ - не уверен, что это можно обойти)

person Mark Harviston    schedule 02.09.2010
comment
Мне нужно узнать больше о командной строке, cd folder1 && zip -r ../bar.zip * - хорошее решение для меня. Спасибо! - person Somebody still uses you MS-DOS; 02.09.2010
comment
bsdtar cf создает файл tar, а не zip. - person BCran; 24.05.2012
comment
Вы правы, я думал, что это следует из расширения, как и для извлечения, но я думаю, что это не так. вам нужно добавить --format zip (и похоже, что это не всегда работает) - person Mark Harviston; 25.05.2012

Вы должны сделать cd /foo/bar, затем zip -r bar.zip ., однако вы можете сгруппировать их скобками для запуска в подоболочке:

# instead of: cd /foo/bar; zip -r bar.zip; cd -

( cd /foo/bar; zip -r bar.zip . )

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

См. руководство по sh.

Compound Commands
    A compound command is one of the following:

    (list) list is executed in a subshell environment (see COMMAND EXECUTION ENVIRONMENT below).  
           Variable assignments and builtin commands that affect the shell's environment do not remain in effect after the command completes.  
           The return status is the exit status of list.
person ryenus    schedule 13.12.2011

Я не могу говорить о рассуждениях ОП. Я тоже искал это решение.

Я нахожусь в середине кодирования программы, которая создает .ods, создавая внутренние файлы xml и сжимая их вместе. Они должны находиться в корневом каталоге архива, иначе вы получите сообщение об ошибке при попытке запустить OOo.

Я уверен, что есть дюжина других способов сделать это: создайте пустой файл .ods в OOo с именем blank.ods, извлеките его в каталог с именем blank, затем попробуйте запустить:

cd blank && zip -r ../blank.ods *

Как я написал, оболочка закрывается после одной команды, поэтому мне не нужно возвращаться в исходный каталог, если вы просто добавите && cd .. в командную строку:

cd blank && zip -r ../blank.ods * && cd ..
person user559888    schedule 01.01.2011