Archiwum Zip z ograniczoną liczbą plików

12

Jakiego polecenia mogę użyć, aby utworzyć zips z ograniczeniem liczby plików? Mam folder (bez podfolderów), powiedzmy, 5000 plików, więc chciałbym uzyskać polecenie, które podzieliłoby tę liczbę i utworzyło 10 osobnych ziparchiwów, z których każdy składałby się z nie więcej niż 500 plików.

Nie chcę też, aby powstałe 10 zipplików było ze sobą połączone, dzięki czemu mogę je otwierać indywidualnie i nie muszę otwierać wszystkich 10 jednocześnie.

użytkownik8547
źródło

Odpowiedzi:

13

Możesz użyć GNU równoległego, aby to zrobić, ponieważ może ograniczyć liczbę elementów do zadania, a także podać numer zadania (dla unikalnej nazwy archiwum zip):

$ 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

Opcja -N 5ogranicza liczbę plików do 5 na archiwum i jest prezentowana zipzamiast{}

{#}(Dosłownie nie może być zastąpiony przez Ciebie podczas wywołania), zastępuje się liczbą miejsc pracy, co powoduje arch1.zip, arch2.zipetc.

-print0Opcja findi -0opcja parallelw tandemie upewnić, że nazwy plików ze znakami specjalnymi są prawidłowo obsługiwane.

Anthon
źródło
Wystąpił błąd: i.imgur.com/JoyPrfY.png Z tego polecenia: znajdź *! -nazwa „* .zip” -typ f -print0 | równolegle -0 -N 500 zip arch {13} {}
user8547
@ user8547, który nie jest GNU równoległy, ale równoległy zawarty w moreutils, najlepiej skompiluj i zainstaluj ze źródła, aby uzyskać najnowsze poprawki bezpieczeństwa. ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2
Anthon
2
@ user8547 nie, po prostu uruchom sudo apt-get install parallel.
terdon
2
@ user8547 dlaczego arch{13}? Naprawdę musisz użyć tej #postaci. Jakiej powłoki używasz?
Anthon
2
@ user8547 Nie, tak można powiedzieć równolegle, aby umieścić tam numer zadania, cieszę się, że się udało.
Anthon
1

Alternatywa tylko dla powłoki: przetwarzaj partie plików COUNT przez "${@:START:COUNT}"(zakres parametrów pozycyjnych) i shift COUNTzwiększając licznik, caby nazwać archiwa:

zestaw - *
c = 1
while (($ #)); robić
  jeśli [$ # -ge COUNT ]; następnie
    zip $ {c} .zip „$ {@: 1: COUNT }”
    c = $ ((c + 1))
    przesuń COUNT
  jeszcze
    zip $ {c} .zip „$ {@}”
    shift $ #
  fi
Gotowe
don_crissti
źródło
1

Przyjęta odpowiedź działała dla mnie idealnie. :) ALE, jeśli nie masz dostępu do równoległego (kto wie dlaczego), oto alternatywa, którą wcześniej wymyśliłem:

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

Który utworzy myarch1.zip, myarch2.zip, myarch3.zip itp. Możesz użyć sztuczki -0 zaproponowanej przez Anthon, jeśli masz dziwne nazwy plików.

msb
źródło