Ich habe ein Verzeichnis mit zu vielen Dateien.
Ich möchte zuerst 5.000 Dateien in diesem Verzeichnis komprimieren, um file.tar.gz
dann 5.001 - 10.000 zu werden ... und so weiter
wie es geht?
Antwort1
Verwenden Sie ls, um die Liste der Namen zu generieren, und head und tail, um sie zu filtern. Hier ist ein Einzeiler, der dies in einer Schleife tut. Sie müssen die Anzahl der Dateien im Verzeichnis kennen (ls | wc -l sagt es Ihnen).
for ii in $(seq -w 5000 5000 NUMBER_OF_FILES) ; do echo $ii ; ls | head -n $ii | tail -n 5000 | tar -f ../ARCHIVE_FILE_$ii.tar.gz -czv -T - ; done
Ersetzen Sie die Großbuchstaben durch die gewünschten Teile.
Antwort2
Dieses Skript fügt nach und nach alle Dateien zum Archiv hinzu und nummeriert das Archiv. Benennen Sie ARCHIVE_NAME und „5000“ um.
$ COUNT_MOD=0; for i in *; do tar -r -f ARCHIVE_NAME`expr $COUNT_MOD / 5000`.tar $i; ((COUNT_MOD++)) ; done
Dieses Skript ist nicht optimiert, daher gibt es einige Regeln:
- ARCHIVE_NAME# darf beim Starten dieses Skripts nicht vorhanden sein. Wenn also etwas fehlschlägt, führen Sie ein „rm ARCHIVE_NAME*“ aus.
- Ein Verzeichniseintrag wird vom Skript als 1 Eintrag behandelt, nicht jedoch „tar“. Tar geht in das Verzeichnis und fügt alle Dateien rekursiv hinzu. Am Ende könnten mehr als 5000 Dateien in einem Archiv sein.
- Komprimierte Archive können nicht aktualisiert werden, ich habe '-z' weggelassen, sorry :-)
Antwort3
Sie könnten einen Satz von Dateien erstellen, die jeweils 5000 Dateinamen auflisten, und diese mit den Argumenten -T für tar verwenden. So etwas könnte funktionieren:
ls -1 | split -l 5000 - tarlist
count=0
for f in tarlist*
do
tar -czf save.$count.tar.gz -T $f
count=`expr $count + 1`
done