Ich habe einen Ordner mit ca. 20K Dateien. Die Dateien werden nach dem Muster benannt xy_{\d1,5}_{\d4}\.abc
, z xy_12345_1234.abc
. Ich wollte die ersten 10 KB mit diesem Befehl komprimieren:
ls | sort -n -k1.4,1.9 | head -n10000 | xargs tar -czf xy_0_10000.tar.gz
Die resultierende Datei enthielt jedoch nur etwa 2K-Dateien.
ls | sort -n -k1.4,1.9 | head -n10000 | wc -l
Gibt jedoch erwartungsgemäß 10000 zurück.
Es scheint mir, dass ich hier etwas Grundlegendes falsch verstehe ...
Ich verwende zsh 5.0.2 unter Linux Mint 17.1, GNU tar 1.27.1
BEARBEITEN:
Das von @Archemar vorgeschlagene Forking klingt sehr plausibel, wobei die neueste Fork die resultierende Datei überschreibt - die Datei enthält den 'Schwanz' der Dateien - 7773 bis 9999 .
Ergebnis von xargs --show-limit
:
Your environment variables take up 3973 bytes
POSIX upper limit on argument length (this system): 2091131
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 2087158
Size of command buffer we are actually using: 131072
Ersetzen -c
durch -r
oder -u
hat in meinem Fall nicht funktioniert. Die Fehlermeldung wartar: Cannot update compressed archives
mit beiden -r
und -u
ist ungültig und schlägt fehl mittar: You may not specify more than one '-Acdtrux', '--delete' or '--test-label' option
Das Ersetzen -c
durch -a
scheint ebenfalls ungültig zu sein und schlägt damit fehl, tar: You must specify one of the '-Acdtrux', '--delete' or '--test-label' options
obwohl ich das Problem nicht erkenne azf
und Acdtrux
mir unzusammenhängend vorkomme.
EDIT 2:
-T sieht nach einem guten Weg aus, ich habe hier auch ein Beispiel gefunden .
Jedoch wenn ich es versuche
ls | sort -n -k1.4,1.9 | head -n10000 | tar -czf xy_0_10000.tar.gz -T -
Ich bekomme
tar: option requires an argument -- 'T'
Nun, vielleicht erreichen die Dateinamen nicht Teer? Aber es sieht so aus, als ob sie es tun, wenn ich es ausführe
ls | sort -n -k1.4,1.9 | head -n10000 | tar --null -czf xy_0_10000.tar.gz -T -
Ich bekomme
tar: xy_0_.ab\nxy_1_...<the rest of filenames separated by literal \n>...998.ab
Cannot stat: File name too long
Warum sieht Teer die Dateinamen nicht?
ls
find
, die die -print0
Option hat, ein Null-Byte als Trennzeichen anstelle eines Zeilenumbruchs zu verwenden. sort
kann das mit der -z
Flagge behandeln. head
, leider nicht verstehen verstehen Null-Byte-Trennzeichen, aber diese Antwort hat eine Lösung mit tr
Swap \n
und \0
vor und nach head
. tar
muss --null -T -
null getrennte Dateinamen von lesen stdin
.