Включить только подкаталоги при создании zip-архива в bash-скрипте - PullRequest
2 голосов
/ 17 ноября 2011

У меня есть структура каталогов, которая выглядит следующим образом:

basedir/dir1/dir2/dir3/dir4/myzip/subdirs

Я хотел бы создать архив myzip dir со всеми его подкаталогами, но без включения dir1 - dir4 в zip-архив, исохраните полученный архив myzip.zip в basedir.

Это не работает, поскольку dir1 до 4 включаются в архив

cd basedir
zip -r myzip.zip dir1/dir2/dir3/dir4/myzip

Я знаю, что могу сделать это таким образом

cd basedir/dir1/dir2/dir3/dir4
zip -r ../../../../myzip.zip myzip
cd ../../../..
# Need to go back to basedir for next commands

Это также работает

cd basedir
cp -r dir1/dir2/dir3/dir4/myzip myzip
zip -r myzip.zip myzip
rm -rf myzip
# Kind of annoying to have to copy then remove

Есть ли более элегантный способ сделать это?Я надеялся, что смогу добавить некоторые аргументы в первую набранную мной команду, чтобы она работала так, как я хотел в одной строке.

Разве я не хочу делать то, что большинство людей тоже хотят делать?ИМО, они должны включать в себя только вложенные каталоги по умолчанию в команде zip.

Я не понимаю смысла текущей реализации zip, потому что все они делают одно и то же:

zip -r myzip.zip dir1/dir2/dir3/dir4/myzip
zip -r myzip.zip dir1/dir2/dir3/dir4
zip -r myzip.zip dir1/dir2/dir3/
zip -r myzip.zip dir1/dir2/
zip -r myzip.zip dir1/

Разве не было бы умнее написать команду zip, чтобы она включала в себя только подкаталоги по умолчанию?

Тогда, если вы хотите включить dir1 - dir4, вы можете просто сделать:

myVersionOfZip -r myzip.zip dir1

Если бы вы хотели только подкаталоги myzip, вы бы сделали:

myVersionOfZip -r myzip.zip dir1/dir2/dir3/dir4/myzip

Ответы [ 2 ]

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

Вы можете избежать CD ../../../ .. если вы используете pushd.

pushd basedir/dir1/dir2/dir3/dir4
zip -r myzip.zip myzip
popd

Архивные инструменты предназначены для сохранения информации о пути, поэтому я сомневаюсь, что есть способ обойти то, что вы пытаетесь.

Это сделает ваш сценарий немного более элегантным.

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

Он не включает в себя любые файлы из basedir / dir1..dir4 - все, что он включает, - это сами каталоги, так как -r сохраняет весь путь, так что когда кто-то извлекает ваш архив, он получает та же структура И в этом также смысл этого поведения, так что «zip -r foo.zip foo /» хранит не только все файлы, но и структуру каталогов.

...