Уникайте небажаного шляху в Zip-файл


49

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

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

Проблема полягає в тому, що в результуючому архіві out.zip є весь шлях до нього. Тобто при розпакуванні він матиме в ньому весь шлях "/ користувачів / мене / розвиток / інше /". Чи можливо уникнути цих глибоких шляхів при введенні каталогу в архів?

Коли я запускаю zip всередині цільового каталогу, у мене немає цієї проблеми.

zip -r out.zip ./folder/

У цьому випадку у мене не все сміття. Однак розглянутий сценарій буде називатися звідки завгодно.

FWIW, я використовую bash на Mac OS X 10.6.

Відповіді:


85

Ваш сценарій повинен використовувати cdабо pushdі popdпереміщуватися в каталог, який буде коренем архіву перед тим, як видавати zipкоманду. Як саме ви це зробите, буде залежати від того, наскільки сценарій знає, що потрібно завантажити. Але, якщо ви хочете, щоб / Користувачі / я / розробка / щось / папка зіштовхувалась внутрішніми шляхами просто ./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
@ ~ quack: +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

5
Невже це також бажає всі шляхи, навіть ті, що знаходяться в каталозі "папки"? Я думаю, що ОП хоче лише позбутися шляху в командному рядку.
Петро Ярич

1
Це може не відповісти на це питання, але це те, що мені потрібно.
Аарон Макміллін

1
Ця відповідь неправильно передбачає, що користувач хоче плоский блискавку. Це неправильне припущення і може спричинити збій сценарію, якщо два файли в різних підпапках мають одне ім’я.
Ендрю Шварц

1

Є pushdі popdі $OLDPWD. Припустимо, що $PWDце /Users/me/developmentзробити:

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

Тепер $PWDповернувся до/Users/me/development

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.