Избегайте нежелательных путей в Zip-файле

49

Я делаю сценарий оболочки для упаковки некоторых файлов. Я архивирую каталог, как это:

zip -r /Users/me/development/something/out.zip /Users/me/development/something/folder/

Проблема в том, что в результирующем архиве out.zip содержится полный путь к файлу. То есть в разархивированном виде он будет иметь полный путь "/ Users / me / development / anotherthing /". Можно ли избежать этих глубоких путей при помещении каталога в архив?

Когда я запускаю zip из целевого каталога, у меня нет этой проблемы.

zip -r out.zip ./folder/

В этом случае я не получаю весь мусор. Однако соответствующий скрипт будет вызываться откуда угодно.

Я использую bash в Mac OS X 10.6.

jerwood
источник

Ответы:

85

Ваш сценарий должен использовать cdили pushdи popdдля перемещения в каталог, который будет корнем архива, перед выполнением zipкоманды. Как именно вы это сделаете, будет зависеть от того, как сценарий знает, что делать. Но если вы хотите, чтобы папка / Users / me / development / кое-что / архивировалась с внутренними путями просто ./folder , вам нужно сделать это:

pushd /Users/me/development/something
zip -r /path/to/out.zip ./folder/
popd

Это приведет к тому, что ваш out.zip будет содержать относительные пути, которые вы хотите.

Если вам нужна помощь в написании сценариев, вам нужно будет показать нам свой сценарий.

шарлатан
источник
8
нет проблем. я делаю это в однострочном режиме в командной строке все время, например: $ pushd /some/path ; do-something ; popd... или даже с подоболочками:$ ( cd /some/path ; do-something )
квик-кихот
1
@ ~ шарлатан: +1 специально для техники субоболочки в комментарии.
Джонатан Леффлер
1
Хотя использование &&вместо ;является хорошей идеей, чтобы другая команда не выполнялась в случае cdсбоя (опечатка или другая проблема):(cd /some/path && do-something)
Крис Джонсен
3
Нет ли способа сделать это без указания абсолютного пути к zip-файлу?
orange80
2
Почему ты играешь в игры с дорожкой? Почему бы не использовать zip -j?
jww
5

Проблема в том, что в результирующем архиве out.zip содержится полный путь к файлу.
...
Можно ли избежать этих глубоких путей при помещении каталога в архив?

Да. Используйте -jопцию с zip. -jэто «мусор путь». Согласно справочной странице на zip :

Храните только имя сохраненного файла (ненужный путь) и не храните имена каталогов. По умолчанию zip будет хранить полный путь (относительно текущего каталога).

Использование -jозначает следующую команду:

zip -j myarchive.zip file1.txt dir1/file2.txt dir2/dir3/file3.txt ../file4.txt

Создайте архив, который выглядит так:

myarchive.zip
    |
    +-- file1.txt
    +-- file2.txt
    +-- file3.txt
    +-- file4.txt
jww
источник
5
Разве это также не спрячет все пути, даже те, которые находятся в каталоге 'folder'? Я думаю, что ОП хочет избавиться только от пути в командной строке.
Питер Ярич
1
Это может быть не ответ на этот вопрос, но это то, что мне нужно.
Аарон Макмиллин
1
Этот ответ неверно предполагает, что пользователь хочет плоский почтовый индекс. Это неверное предположение и может привести к сбою сценария, если два файла в разных подпапках имеют одинаковые имена.
Эндрю Шварц
1

Есть pushdи popdи $OLDPWD. Предполагая, что $PWDэто /Users/me/developmentсделать:

pushd something/folder
zip -r $OLDPWD/something/out.zip *
popd

Теперь $PWDвернулся/Users/me/development

borodark
источник