Створення zip-файлів та ігнорування структури каталогів


217

Мені потрібно створити zip-файл за допомогою цієї команди:

zip /dir/to/file/newZip /data/to/zip/data.txt

Це працює, але створений zip-файл створює структуру каталогу, що імітує каталог на необроблений файл. Багато зайвих папок мені не потрібно.

Я не знайшов відповіді побічним поглядом на сторінку людини або на полювання в Google.



2
Я думав, що це питання передувало всім цим іншим бірж стеків, але на жаль, посада суперпопулярного насправді старша за цю. Якщо я можу щось зробити тут, щоб допомогти мені повідомити. Це має бути досить гарячою відповіддю, оскільки Google все ще приводить сюди стільки трафіку. : D
Джейк

Відповіді:


352

Можна використовувати -j.

-j
--junk-paths
          Store just the name of a saved file (junk the path), and do  not
          store  directory names. By default, zip will store the full path
          (relative to the current directory).

19
Якщо -jця робота не працює у вашому каталозі (разом із -r),
замовіть

колись це просто не працює ... віддайте перевагу @czerasz посилання;), яке в основному є комбінованим popd комбо
TecHunter

36

Використання -jне буде працювати разом із -rопцією.
Тож обхід для цього може бути таким:

cd path/to/parent/dir/;
zip -r complete/path/to/name.zip ./* ;
cd -;

Або вбудована версія

cd path/to/parent/dir/ && zip -r complete/path/to/name.zip ./* && cd -

ви можете направити вихід, /dev/nullякщо ви не хочете, щоб cd -вихід відображався на екрані


Насправді ви можете зробити наступне:cd path/to/parent/dir/ && zip -r ../../../../name.zip ./* && cd -
eddyP23

@ eddyP23 Як це має значення? Швидше це призведе до того, що ви додасте ні. з parentDir (..) для кожного каталогу в шляху: |
Vikas Tawniya

Результат такий же, я згоден. Але в автоматизованих сценаріях, які працюють у багатьох різних середовищах, ви зазвичай уникаєте глобальних шляхів, тому що не маєте поняття, яким буде глобальний шлях. Але cd path/to/parent/dir/ви можете легко обчислити кількість подвійних крапок ../.
eddyP23

@ eddyP23 має сенс
Vikas Tawniya

33

Скористайтеся -jопцією:

   -j     Store  just the name of a saved file (junk the path), and do not
          store directory names. By default, zip will store the full  path
          (relative to the current path).


3

Можна також створити тимчасове символічне посилання на ваш файл:

ln -s /data/to/zip/data.txt data.txt
zip /dir/to/file/newZip !$
rm !$

Це також працює для каталогу.


1

Збережіть батьківський каталог так unzip не скріплювати файли скрізь

Під час копіювання каталогів зберігання батьківського каталогу в архіві допоможе уникнути засмічення поточного каталогу, коли ви згодом розпакуйте файл архіву.

Таким чином, щоб уникнути збереження всіх шляхів, а оскільки ви не можете використовувати -j і -r разом (ви отримаєте помилку), можете зробити це замість цього:

cd path/to/parent/dir/;
zip -r ../my.zip ../$(basename $PWD)
cd -;

The ../$(basename $PWD) магія зберігає батьківський каталог.

Тож тепер unzip my.zipнадамо папку, що містить усі ваші файли:

parent-directory
├── file1
├── file2
├── dir1
│   ├── file3
│   ├── file4

Замість того, щоб засмічувати поточний каталог розпакованими файлами:

file1
file2
dir1
├── file3
├── file4

0

Просто скористайтеся -jrmопцією, щоб видалити файли та структури каталогів

zip -jrm /path/to/file.zip /path/to/file

будьте обережні, -m - перемістити вказані файли в zip-архів; насправді це видаляє цільові каталоги / файли після створення зазначеного zip-архіву. Якщо каталог видаляється після видалення файлів, він також видаляється. Видалення не робиться, поки zip не створив архів без помилок. Це корисно для збереження місця на диску, але потенційно небезпечно, тому рекомендується використовувати його в поєднанні з -T для перевірки архіву перед видаленням усіх вхідних файлів.
каталінт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.