42

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

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.

2 ответа2

78

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

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

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

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

4

Проблема в том, что в результирующем архиве 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .