![Архивирование с сохранением относительных каталогов из любой точки мира](https://rvso.com/image/1554892/%D0%90%D1%80%D1%85%D0%B8%D0%B2%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%20%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC%20%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D1%85%20%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2%20%D0%B8%D0%B7%20%D0%BB%D1%8E%D0%B1%D0%BE%D0%B9%20%D1%82%D0%BE%D1%87%D0%BA%D0%B8%20%D0%BC%D0%B8%D1%80%D0%B0.png)
Пытаюсь получить определенную функциональность из 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
.