
Пытаюсь получить определенную функциональность из zip
. Я хотел бы рекурсивно заархивировать все в определенный каталог и сохранить структуру каталогов ТОЛЬКО из этого каталога, но не делать полный путь частью архива.
Допустим, у меня есть /path/to/test/tmp/
и я хочу, чтобы все содержимое tmp/
было заархивировано, как будто я запускаю команду из этой папки.
Флаг -r
получает то, что мне нужно, но включает информацию о пути над нужным мне каталогом, в зависимости от того, где я его запускаю:
user@MBP:~/path/to/test$ zip -r myarchive.zip tmp/
adding: tmp/foo.txt (deflated 68%)
adding: tmp/bar/bar.txt (deflated 41%)
adding: tmp/baz/baz/baz.txt (deflated 92%)
Флаг -j
обрезает все, кроме имен файлов:
user@MBP:~/path/to/test$ zip -rj myarchive.zip tmp/
adding: foo.txt (deflated 68%)
adding: bar.txt (deflated 41%)
adding: baz.txt (deflated 92%)
Мне нужно что-то, что даст мне следующее:
adding: foo.txt (deflated 68%)
adding: bar/bar.txt (deflated 41%)
adding: baz/baz/baz.txt (deflated 92%)
Но я могу указать, что это должно быть запущено откуда угодно. Я пытаюсь записать это в cron. Я не могу найти то, что я ищу встраница руководства. Как мне это осуществить, кроме как фактически изменить каталоги в моем скрипте?
решение1
Похоже zip
, (по крайней мере, версия от Info-ZIP, которая установлена на моей платформе) не позволяет этого сделать. (В отличие от tar
, у которого есть опция -C
/ --directory
, как намекнул @Xen2050.)
Но, я должен спросить, так ли плохо менять каталоги в вашем скрипте? Особенно, если вы можете сделать это в подпрограмме и не повлиять на текущий рабочий каталог скрипта (подробно объясненов этом SO ответ):
pwd
(cd /path/to/test/tmp; zip -r myarchive.zip .)
pwd # prints the same as in line 1
Обратите внимание, что при этом конечный ZIP-файл будет сохранен в формате /path/to/test/tmp
.