Подкаталог архивирования Unix, не включающий родительский каталог

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

e.g.

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. Также было бы здорово иметь дело с абсолютными путями, старое решение использовало cd о месте, но мне это не очень нравилось. Возможно, это лучший (единственный) способ.


person henry.oswald    schedule 17.11.2011    source источник
comment
-r означает рекурсивный. Если вам действительно нужно это использовать, вам следует прочитать о параметрах почтового индекса для исключения. Если вы просто хотите заархивировать один файл, перейдите в соответствующий родительский каталог (в вашем примере) ./Unwanted1/Unwanted2, а затем zip new.zip wanted/file.txt. То есть я не думаю, что есть опция zip, которая означает «отбросить первые n слоев информации о подкаталоге во входном имени файла». Удачи.   -  person shellter    schedule 18.11.2011
comment
С тех пор вы отредактировали свой пример, который изрядно изменил игру. Людям обычно не нужны такие абсолютные пути. Внутри 'zip' может быть больше параметров обрезки/управления путями, но я сомневаюсь в этом. Прочтите справочную страницу. Или переключитесь на «tar» и прочитайте эту (одинаково длинную) справочную страницу. И вам по-прежнему не нужен -r, если вы добавляете один файл, независимо от того, насколько он глубок.   -  person IcarusNM    schedule 19.11.2011


Ответы (3)


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

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

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

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

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

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

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

person IcarusNM    schedule 17.11.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 -@
person sehe    schedule 17.11.2011
comment
Как бы я ни предпочел, чтобы флаг/опция в zip опускала структуру родительской папки, лучшего способа не найти. Оба флага, -j или -D, не делали того, что мы хотели, в сложной структуре подпапок. - person paperclip; 07.12.2016

Ну, один простой способ может заключаться в том, чтобы сделать

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

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

person loosebazooka    schedule 17.11.2011
comment
Спасибо, на самом деле это несколько каталогов и файлов, например, v.simple - person henry.oswald; 18.11.2011
comment
Да, как говорят icarus и sehe, если вы заключите команды в круглые скобки, это не испортит ваш текущий рабочий каталог после завершения выполнения. - person loosebazooka; 18.11.2011