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

1648

Ich habe ein Verzeichnis mit zu vielen Dateien darin.

Ich möchte zuerst 5 Tausend Dateien in diesem Verzeichnis komprimieren, um file.tar.gzdann 5001 - 10000 zu werden ... und so weiter

wie es geht?

2
Sind die ersten fünftausend anders benannt als die nächsten? vor 13 Jahren 0
Ja. sehr unterschiedlicher Name vor 13 Jahren 0
Haben Sie versucht, einen regulären Ausdruck zu verwenden, um den ersten 5k zu entsprechen? Dann vielleicht ein einfaches Perl- oder Python-Skript, um die Beinarbeit zu erledigen vor 13 Jahren 0

3 Antworten auf die Frage

0
Optimal Cynic

Verwenden Sie ls, um die Liste mit Namen und Kopf und Ende zu generieren, um sie zu filtern. Hier ist ein Einzeiler, der es in einer Schleife macht. Sie müssen die Anzahl der Dateien im Verzeichnis kennen (ls | wc -l wird Sie darauf hinweisen).

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 Bits in Großbuchstaben durch das, was Sie möchten.

Useless Use Of ls Award geht an ... Hello71 vor 12 Jahren 0
0
karatedog

Dieses Skript fügt dem Archiv nach und nach alle Dateien 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 etwas fehlschlägt, führen Sie ein 'rm ARCHIVE_NAME *' aus.
  2. Ein Verzeichniseintrag wird vom Skript als 1 Eintrag behandelt, jedoch nicht als "tar". Tar geht in das Verzeichnis und fügt alle Dateien rekursiv hinzu. Möglicherweise landen mehr als 5000 Dateien in einem Archiv.
  3. Komprimierte Archive können nicht aktualisiert werden, ich habe '-z' ausgelassen, sorry :-)
Sie könnten stattdessen `for i in *` verwenden. Wuffers vor 12 Jahren 0
0
Shannon Nelson

Sie könnten eine Reihe von Dateien erstellen, die jeweils 5000 Dateinamen auflisten und 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