Архивирование с сохранением относительных каталогов из любой точки мира

Архивирование с сохранением относительных каталогов из любой точки мира

Пытаюсь получить определенную функциональность из 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.

Связанный контент