Bagaimana cara membuat zip dengan banyak file tanpa sub-folder?

12

Situasi awal:

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

Apa yang perlu saya lakukan:

Saya ingin membuat zip yang berisi d0, d1 dan d4 yang harus memiliki struktur fallowing:

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

Apa yang sudah saya coba:

Saya mencobanya dengan zip myfiles d0 f1/d1 f2/f3/d4. Tapi ini membuat struktur folder asli, yang bukan yang saya inginkan.

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

Pertanyaan Bagaimana cara membuat zip dengan banyak file tanpa sub-folder?

eDeviser
sumber

Jawaban:

17

Secara manual, Anda dapat membuat file zip dan memperbaruinya:

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

Tanda kurung membuat subkulit, dan efek dari cdhanya berlangsung di subkulit, sehingga Anda tidak harus cdkembali ke direktori asli.

Jika d1,, d2dll. Sebenarnya adalah file dan bukan direktori itu sendiri, maka gunakan -jopsi:

-j
--junk-paths
Menyimpan hanya nama file yang disimpan (junk the path), dan jangan menyimpan nama direktori. Secara default, zip akan menyimpan path lengkap (relatif terhadap direktori saat ini).

muru
sumber
19

Anda dapat menggunakan finduntuk mendapatkan daftar file dan mengeksekusi zip -j myfilesuntuk mengemasnya mengabaikan jalan:

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

Contoh

$ 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

Namun ini hanya berfungsi untuk file , direktori akan diabaikan oleh zip -j. Untuk mendapatkan ini berfungsi untuk direktori juga, katakanlah kita ingin berkemas d0, d1dan seluruh f3direktori pada contoh di atas, findbaris menjadi sedikit lebih rumit:

$ 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
pencuci mulut
sumber
18

Menggunakan opsi -j akan menghapus path dari file.

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

referensi

ravery
sumber
jika salah satu jalur yang Anda lewati bukanlah file tetapi direktori, direktori tersebut tidak akan ditambahkan ke zipfile dengan -jopsi.
Dan
@dan - jika Anda ingin semua file dalam direktori tanpa jalur laluzip -j myfiles directory/*
ravery