Як створити zip з кількома файлами без підпапок?


12

Початкова ситуація:

.
├── d0
├── f0
├── f1
│   └── d1
└── f2
    └── f3
        ├── d2
        ├── d3
        └── d4

Що мені потрібно зробити:

Я хотів би створити блискавку, що містить d0, d1 і d4, яка повинна мати наступну структуру:

.
├── d0
├── d1
└── d4

Що я вже спробував:

Я спробував це zip myfiles d0 f1/d1 f2/f3/d4. Але це зберігає оригінальну структуру папок, яка не є тим, що я хочу.

.
├── d0
├── f1
│   └── d1
└── f2
    └── f3
        └── d4

Питання Як створити поштовий індекс з кількома файлами без підпапок?

Відповіді:


17

Вручну ви можете створити zip-файл та оновити його:

zip myfiles d0
(cd f1; zip -u ../myfiles.zip d1)
(cd f2/f3; zip -u ../../myfiles.zip d4)

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

Якщо d1і d2т. Д. Фактично є файлами, а не самими каталогами, то скористайтеся -jопцією:

-j
--junk-paths
Збережіть лише ім’я збереженого файлу (непотрібний шлях), а також не зберігайте імена каталогів. За замовчуванням zip зберігатиме повний шлях (щодо поточного каталогу).


19

Ви можете скористатися findдля отримання списку файлів та виконання, zip -j myfilesщоб упакувати їх, ігноруючи шляхи:

find . -name "d[014]" -exec zip -j myfiles {} +

Приклад

$ tree
.
├── d0
├── f0
├── f1
│   └── d1
└── f2
    └── f3
        ├── d2
        ├── d3
        └── d4

$ find . -name "d[014]" -exec zip -j myfiles {} +
  adding: d1 (stored 0%)
  adding: d4 (stored 0%)
  adding: d0 (stored 0%)

$ unzip -l myfiles.zip
Archive:  myfiles.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-10-09 10:47   d1
        0  2017-10-09 10:48   d4
        0  2017-10-09 10:47   d0
---------                     -------
        0                     3 files

Однак це працює лише для файлів , каталоги будуть проігноровані zip -j. Щоб ця робота працювала і для каталогів, скажімо, ми хочемо упакувати d0, d1і весь f3каталог у наведеному вище прикладі findрядок стає дещо складнішим:

$ find . \( -name "d[01]" -o -name "f3" \) -exec sh -c 'p=$(pwd); for i in $0 $@; do cd ${i%/*}; zip -ur "$p"/myfiles ${i##*/}; cd "$p"; done' {} +
        zip warning: /home/dessert/myfiles.zip not found or empty
  adding: d1 (stored 0%)
  adding: f3/ (stored 0%)
  adding: f3/d3 (stored 0%)
  adding: f3/d2 (stored 0%)
  adding: f3/d4 (stored 0%)
  adding: d0 (stored 0%)
$ unzip -l myfiles.zip 
Archive:  myfiles.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-10-11 10:18   d1
        0  2017-10-11 10:19   f3/
        0  2017-10-11 10:19   f3/d3
        0  2017-10-11 10:19   f3/d2
        0  2017-10-11 10:19   f3/d4
        0  2017-10-11 10:17   d0
---------                     -------
        0                     6 files

18

Використовуючи параметр -j, вилучите шлях з файлу.

zip -j myfiles d0 f1/d1 f2/f3/d4 

довідник


якщо будь-який із пройдених вами шляхів не є файлами, а є каталогами, ці каталоги не будуть додані до zipфайлу з -jопцією.
Ден

@dan - якщо ви хочете, щоб усі файли в каталозі були з шляху, тодіzip -j myfiles directory/*
ravery
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.