Zip-Archiv mit begrenzter Anzahl von Dateien

12

Mit welchem ​​Befehl kann ich zips mit einem Dateinummernlimit erstellen ? Ich habe einen Ordner (keine Unterordner) mit beispielsweise 5000 Dateien, daher möchte ich einen Befehl, der diese Anzahl teilt und 10 einzelne zipArchive erstellt, die jeweils aus nicht mehr als 500 Dateien bestehen.

Ich möchte auch nicht, dass die resultierenden 10 zipDateien miteinander verbunden werden, damit ich sie einzeln öffnen kann und nicht alle 10 gleichzeitig öffnen muss.

user8547
quelle

Antworten:

13

Sie können dazu GNU parallel verwenden, da dies die Anzahl der Elemente für einen Job begrenzen und eine Jobnummer angeben kann (für einen eindeutigen Namen des Zip-Archivs):

$ 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

Die Option -N 5begrenzt die Anzahl der Dateien auf 5 pro Archiv und wird zipanstelle von angezeigt{}

Die {#}(wörtlich, nicht von Ihnen während des Aufrufs ersetzt werden), wird durch die Auftragsnummer ersetzt, was zu arch1.zip, arch2.zipusw.

Die -print0Option findund die -0Option parallelim Tandem stellen sicher, dass Dateinamen mit Sonderzeichen korrekt behandelt werden.

Anthon
quelle
Ich habe diesen Fehler erhalten: i.imgur.com/JoyPrfY.png Von diesem Befehl: find *! -name "* .zip" -Typ f -print0 | parallel -0 -N 500 zip arch {13} {}
user8547
@ user8547 Das ist nicht GNU parallel, sondern die in moreutils enthaltene Parallele. Sie kompilieren und installieren am besten aus dem Quellcode, um die neuesten Sicherheitspatches zu erhalten. ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2
Anthon
2
@ user8547 nein, einfach ausführen sudo apt-get install parallel.
Terdon
2
@ user8547 warum arch{13}? Sie müssen den #Charakter wirklich verwenden . Welche Shell benutzt du?
Anthon
2
@ user8547 Nein, das ist die Möglichkeit, parallel zu sagen, dass die Jobnummer dort abgelegt werden soll. Ich bin froh, dass es geklappt hat.
Anthon
1

Eine reine Shell-Alternative: Verarbeiten von Stapeln von COUNT- Dateien über "${@:START:COUNT}"(Bereich von Positionsparametern) und shift COUNTwährend Sie einen Zähler erhöhen, um cdie Archive zu benennen:

einstellen -- *
c = 1
while (($ #)); tun
  if [$ # -ge COUNT ]; dann
    zip $ {c} .zip "$ {@: 1: COUNT }"
    c = $ ((c + 1))
    Verschiebung COUNT
  sonst
    zip $ {c} .zip "$ {@}"
    Shift $ #
  fi
erledigt
don_crissti
quelle
1

Die akzeptierte Antwort hat für mich einwandfrei funktioniert. :) ABER, falls Sie keinen Zugriff auf Parallel haben (wer weiß warum), hier ist eine Alternative, die ich mir zuvor ausgedacht habe:

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

Dadurch werden myarch1.zip, myarch2.zip, myarch3.zip usw. erstellt. Sie können den von Anthon vorgeschlagenen Trick -0 verwenden, wenn Sie seltsame Dateinamen haben.

msb
quelle