"tar -czf" für die ersten 5.000 Dateien

"tar -czf" für die ersten 5.000 Dateien

Ich habe ein Verzeichnis mit zu vielen Dateien.

Ich möchte zuerst 5.000 Dateien in diesem Verzeichnis komprimieren, um file.tar.gzdann 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:

  1. ARCHIVE_NAME# darf beim Starten dieses Skripts nicht vorhanden sein. Wenn also etwas fehlschlägt, führen Sie ein „rm ARCHIVE_NAME*“ aus.
  2. 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.
  3. 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

verwandte Informationen