Zip viele Dateien in mehrere Archive

13

Linux ausführen. Ich habe ein Verzeichnis von ungefähr 150 großen CSV-Dateien; Wenn Sie sie einfach bearbeiten zip -9, wird eine monolithische Datei erstellt, die immer noch zu groß ist. Ich möchte, dass sie einfach in vier oder fünf Zip-Dateien mit jeweils 30-40 CSVs komprimiert werden. Auf diese Weise ist die Sequenzierung oder die übergreifende Zip-Reihenfolge kein Problem, da jede Zip unabhängig ist. Es muss einen einfachen Weg geben, dies zu tun. Irgendwelche Vorschläge?

(und ja, zip ist das bevorzugte Format, wenn möglich)

WorldsEndless
quelle

Antworten:

23

Ist -s Schalter nicht genug? Sie können zip -s verwenden, um die Datei in Dateien mit maximaler Größe aufzuteilen, z.

"zip -s 300m <2 GB Datei>" erzeugt:

file.zip (300 mb, master file)
file.001.zip (300 mb)
file.002.zip (300 mb)
file.003.zip (300 mb)
file.004.zip (300 mb)
file.005.zip (300 mb)
file.006.zip (200 mb)

Dann wird "unzip file.zip" alles zusammen entpacken.

Ranisalt
quelle
Welche Version von zip ist das? Ich bekomme file.z01 file.z02 ... file.zip und unzip file.ziparbeite nicht direkt (ich würde zip -F verwenden, um sie zuerst neu zu kombinieren). Beachten Sie, dass diese nicht wie gewünscht "unabhängig" sind.
Sourcejedi
1
@sourcejedi: In dieser Antwort ( superuser.com/a/602736/195224 ) finden Sie einige detailliertere Erklärungen.
mpy
@mpy Ich weiß, ich habe gerade diese Antwort geschrieben :).
Sourcejedi
@sourcejedi: Oh ja, jetzt sagst du es ...;)
mpy
2

Verwendung split in der Liste der Eingabedateien :-).

(Nicht getestet, ich habe rm-Befehle zur Bereinigung eingefügt, seien Sie vorsichtig).

ls *.csv > csvfiles
split -d -l30 - csvfiles < csvfiles
for i in csvfiles[0-9][0-9]; do
  zip "$i.zip" -@ < "$i"
done

rm csvfiles
rm csvfiles[0-9][0-9]
sourcejedi
quelle
Warum benutzt du split -C( --line-bytes) und nicht split -l( --lines)? Das wäre vorhersehbarer, wenn man bedenkt, wie viele CSV-Dateien sich in einem Archiv befinden.
Mpy
Ich habe die Manpage zu schnell überflogen. Danke, ich werde es reparieren!
Sourcejedi