Alt klasörleri olmayan birden çok dosya içeren bir zip nasıl oluşturulur?


12

Başlangıç ​​durumu:

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

Yapmam gerekenler:

Ben nadas yapısına sahip olması gereken d0, d1 ve d4 içeren bir zip oluşturmak istiyorum:

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

Zaten denedim:

Ben denedim zip myfiles d0 f1/d1 f2/f3/d4. Ama bu orijinal klasör yapısını koruyor, istediğim bu değil.

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

Question Alt klasörler olmadan birden fazla dosya içeren bir zip nasıl oluşturulur?

Yanıtlar:


17

Manuel olarak zip dosyasını oluşturabilir ve güncelleyebilirsiniz:

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

Parantezler alt kabuklar oluşturur ve cdyalnızca alt kabuğun etkisi devam eder, böylece cdorijinal dizine geri dönmek zorunda kalmazsınız .

Eğer d1, d2vb aslında dosyaları olduğundan ve dizinleri kendileri, sonra kullanmak -jseçeneği:

-j
--junk-paths
Sadece kaydedilmiş bir dosyanın adını (yolu önemsiz olarak) saklayın ve dizin adlarını saklamayın. Varsayılan olarak zip, tam yolu saklar (geçerli dizine göre).


19

Sen kullanabilirsiniz finddosya listesini almak için ve yürütmek zip -j myfilesyolları görmezden onları paketlemek için:

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

Misal

$ 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

Ancak bu yalnızca dosyalar için geçerlidir , dizinler tarafından yok sayılır zip -j. Çok dizinler için bu çalışma almak için, paketi istediğini söylüyorsun d0, d1ve bütün f3yukarıdaki örnekte dizin, findçizgi biraz daha karmaşık alır:

$ 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 seçeneğinin kullanılması yolu dosyadan kaldırır.

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

referans


geçtiğiniz yollardan herhangi biri dosya değil, dizin ise, bu dizinler seçenekle zipbirlikte dosyaya eklenmez -j.
Dan

@danzip -j myfiles directory/*
ravery
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.