Команда Zip без включения самого сжатого каталога - PullRequest
5 голосов
/ 02 сентября 2010

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

/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).

Ответы [ 3 ]

8 голосов
/ 13 декабря 2011

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

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

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

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

См. sh manual .

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.
6 голосов
/ 02 сентября 2010

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

.

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

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

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

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

bsdtar cf bar.zip - формат zip -C папка1.

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

2 голосов
/ 01 января 2011

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

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

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

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

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

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