Unix zip подкаталог, не включая родительский каталог - PullRequest
11 голосов
/ 18 ноября 2011

Я хочу заархивировать подкаталог и отправить его в другое место, у меня проблема в том, что когда я использую команду zip, она также включает все нежелательные слои каталогов, которые мне не нужны.

, например

zip -r /new.zip /Unwanted1/Unwanted2/wanted1/wanted2/file.txt

###unzipped produces the following
/Unwanted1/Unwanted2/wanted1/wanted2/file.txt

###I want
/wanted1/wanted2/file.txt

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

Ответы [ 3 ]

17 голосов
/ 18 ноября 2011

Вы должны поменять каталоги туда, где вы хотите начать, или, возможно, есть опция «архивировать», чтобы сделать это за вас.Если вам лень читать опции gazillion на странице руководства, как я, просто сначала «cd», даже в сценарии.Или вы можете заключить все в круглые скобки, не затрагивая рабочую директорию вашей оболочки или скрипта:

(cd Unwanted1/Unwanted2; zip -r ~/new.zip ./wanted/file.txt)

Или, так как вы используете -r, вы, вероятно, хотите больше, чем просто file.txt, поэтому:

(cd Unwanted1/Unwanted2; zip -r ~/new.zip wanted)

Или используйте pushd / popd для входа / выхода:

pushd Unwanted1/Unwanted2
zip -r ~/new.zip wanted
popd

Это работает в sh / bash / csh / tcsh.

3 голосов
/ 18 ноября 2011

Ну, одним из простых способов может быть

cd ./Unwanted1/Unwanted2
zip -r ../../new.zip ./wanted/file.txt

Но я не знаю, какова ваша ситуация. Возможно, вам необходимо запустить из базовой директории? Также опция «-r» используется, когда вы хотите рекурсивно обходить каталоги - в качестве примера вы использовали один файл.

3 голосов
/ 18 ноября 2011

Самый простой идиоматический способ:

(cd ./Unwanted1/Unwanted2 && zip -r ../../new.zip ./wanted/file.txt)

Теперь у zip, tar, rar, cpio и друзей есть опции для управления тем же, но они могут различаться в зависимости от версии и версии.конечно из архивной утилиты в архивную утилиту.Я предлагаю вам научиться работать с оболочкой, чтобы выполнить эту работу, и вы можете использовать любой формат архива, какой пожелаете

Другой способ:

(cd ./Unwanted1/Unwanted2 && find . -name "*.txt" -print) | zip new.zip -@
...