Начальная ситуация:
.
├── d0
├── f0
├── f1
│ └── d1
└── f2
└── f3
├── d2
├── d3
└── d4
Что я должен сделать:
Я хотел бы создать zip, содержащую d0, d1 и d4, который должен иметь структуру парования:
.
├── d0
├── d1
└── d4
Что я уже попробовал:
Я попробовал его zip myfiles d0 f1/d1 f2/f3/d4
. Но это сохраняет исходную структуру папок, которая не является тем, что я хочу.
.
├── d0
├── f1
│ └── d1
└── f2
└── f3
└── d4
Подвергните сомнению, Как создать zip с несколькими файлами без подпапок?
Вручную, можно создать 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
- пути спама
Хранилище просто название сохраненного файла (выбрасывают путь), и не хранят имена каталогов. По умолчанию zip сохранит полный путь (относительно текущего каталога).
Можно использовать 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