Sınırlı Sayıda Dosya ile Zip Arşivi


12

zipDosya numarası sınırlamalı s oluşturmak için hangi komutu kullanabilirim ? 5000 dosyadan oluşan bir klasör (alt klasör yok) var, bu yüzden bu sayıyı bölen ve zipher biri en fazla 500 dosyadan oluşan 10 ayrı arşiv oluşturabilecek bir komut istiyorum .

Ayrıca, ortaya çıkan 10 zipdosyanın birbirine bağlanmasını istemiyorum , böylece bunları ayrı ayrı açabiliyorum ve aynı anda 10'un tümünü açmaya gerek kalmayacak.

Yanıtlar:


13

Bunu yapmak için GNU'yu paralel olarak kullanabilirsiniz , çünkü bir iş için öğe sayısını sınırlayabilir ve bir iş numarası sağlayabilir (benzersiz bir zip arşivi adı için):

$ touch $(seq 20)
$ find . ! -name "*.zip" -type f -print0 | parallel -0 -N 5 zip arch{#} {}
  adding: 1 (stored 0%)
  adding: 10 (stored 0%)
  adding: 11 (stored 0%)
  adding: 12 (stored 0%)
  adding: 13 (stored 0%)
  adding: 14 (stored 0%)
  adding: 15 (stored 0%)
  adding: 16 (stored 0%)
  adding: 17 (stored 0%)
  adding: 18 (stored 0%)
  adding: 19 (stored 0%)
  adding: 2 (stored 0%)
  adding: 20 (stored 0%)
  adding: 3 (stored 0%)
  adding: 4 (stored 0%)
  adding: 5 (stored 0%)
  adding: 6 (stored 0%)
  adding: 7 (stored 0%)
  adding: 8 (stored 0%)
  adding: 9 (stored 0%)
$ ls
1   11  13  15  17  19  20  4  6  8  arch1.zip  arch3.zip
10  12  14  16  18  2   3   5  7  9  arch2.zip  arch4.zip

Bu seçenek -N 5, dosya sayısını arşiv başına 5 ile sınırlar ve zipyerine{}

{#}(Harfi harfine çağrı sırasında sizin tarafınızdan değiştirilmesi değil), sonuçlanan iş sayısına göre değiştirilir arch1.zip, arch2.zipvb

Birbirine göre -print0seçenek findve -0seçenek parallel, özel karakterlere sahip dosya adlarının doğru şekilde işlendiğinden emin olun.


Bu hatayı aldım: i.imgur.com/JoyPrfY.png Bu komuttan: find *! -adı "* .zip" -tipi f -print0 | paralel -0 -N 500 zip kemer {13} {}
kullanıcı8547

@ user8547, bu GNU paralel değildir, ancak moreutils içindeki paralel, en son güvenlik yamalarını almak için kaynaktan en iyi şekilde derleyip kurabilirsiniz. ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2
Anthon

2
@ user8547 hayır, sadece çalıştırın sudo apt-get install parallel.
terdon

2
@ user8547 neden arch{13}? Gerçekten #karakteri kullanmanız gerekiyor . Hangi kabuğu kullanıyorsun?
Anthon

2
@ user8547 Hayır, iş numarasını buraya koymak için paralel anlatmanın yolu, işe yaradığı için memnunum.
Anthon

1

Yalnızca kabuk alternatifi: COUNT dosya grubunu "${@:START:COUNT}"(konumsal parametre aralığı) aracılığıyla ve arşivleri adlandırmak için shift COUNTbir sayacı arttırarak cişleyin:

Ayarlamak -- *
c = 1
while (($ #)); yapmak
  [$ # -ge COUNT ] ise; sonra
    zip $ {c} .zip "$ {@: 1: COUNT }"
    c = $ ((c + 1))
    shift COUNT
  Başka
    zip $ {c} .zip "$ {@}"
    shift $ #
  fi
tamam

1

Kabul edilen cevap benim için gayet iyi çalıştı. :) AMA, paralel erişiminiz yoksa (nedenini bilen), işte daha önce bulduğum bir alternatif:

find . ! -name '*.zip' -type f | xargs -n 500 | awk '{system("zip myarch"NR".zip "$0)}'

Hangi garip dosya adlarınız varsa, myarch1.zip, myarch2.zip, myarch3.zip, vb. Yaratacaktır.

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.