J'ai un dossier avec environ 20K fichiers. Les fichiers sont nommés selon le modèle xy_{\d1,5}_{\d4}\.abc, par exemple xy_12345_1234.abc. Je voulais compresser les premiers 10K d'entre eux en utilisant cette commande:
ls | sort -n -k1.4,1.9 | head -n10000 | xargs tar -czf xy_0_10000.tar.gz
cependant, le fichier résultant ne contenait qu'environ 2 Ko de fichiers.
ls | sort -n -k1.4,1.9 | head -n10000 | wc -l renvoie cependant 10 000, comme prévu.
Il me semble que je comprends mal quelque chose de fondamental ici ...
J'utilise zsh 5.0.2 sous Linux Mint 17.1, GNU tar 1.27.1
ÉDITER:
la fourche telle que suggérée par @Archemar semble très plausible, la dernière fourchette écrasant le fichier résultant - le fichier contient la «queue» des fichiers - 7773 à 9999 .
résultat de 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
remplacer -cpar -rou -un'a pas fonctionné dans mon cas. Le message d'erreur étaittar: Cannot update compressed archives
en utilisant les deux -ret -un'est pas valide et échoue avectar: You may not specify more than one '-Acdtrux', '--delete' or '--test-label' option
le remplacement -cpar -asemble également invalide et échoue avec le même tar: You must specify one of the '-Acdtrux', '--delete' or '--test-label' optionssi je ne reconnais pas le problème azfet Acdtruxme semble disjoint.
EDIT 2:
-T ressemble à un bon moyen, j'ai également trouvé un exemple ici .
Mais quand j'essaye
ls | sort -n -k1.4,1.9 | head -n10000 | tar -czf xy_0_10000.tar.gz -T - Je reçois
tar: option requires an argument -- 'T'
bien, peut-être que les noms de fichiers n'atteignent pas tar? Mais on dirait qu'ils le font parce que quand j'exécute
ls | sort -n -k1.4,1.9 | head -n10000 | tar --null -czf xy_0_10000.tar.gz -T - Je reçois
tar: xy_0_.ab\nxy_1_...<the rest of filenames separated by literal \n>...998.ab
Cannot stat: File name too long
Alors pourquoi tar ne voit-il pas les noms de fichiers?
ls
find, qui a une -print0option pour utiliser un octet nul comme délimiteur au lieu d'une nouvelle ligne. sortpeut gérer cela avec le -zdrapeau. head, malheureusement, ne gère pas les séparateurs d'octets nuls, mais cette réponse a une solution en utilisant trpour permuter \net \0avant et après head. tardoit --null -T -lire les noms de fichiers séparés par des valeurs nulles stdin.