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 -c
par -r
ou -u
n'a pas fonctionné dans mon cas. Le message d'erreur étaittar: Cannot update compressed archives
en utilisant les deux -r
et -u
n'est pas valide et échoue avectar: You may not specify more than one '-Acdtrux', '--delete' or '--test-label' option
le remplacement -c
par -a
semble également invalide et échoue avec le même tar: You must specify one of the '-Acdtrux', '--delete' or '--test-label' options
si je ne reconnais pas le problème azf
et Acdtrux
me 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 -print0
option pour utiliser un octet nul comme délimiteur au lieu d'une nouvelle ligne. sort
peut gérer cela avec le -z
drapeau. head
, malheureusement, ne gère pas les séparateurs d'octets nuls, mais cette réponse a une solution en utilisant tr
pour permuter \n
et \0
avant et après head
. tar
doit --null -T -
lire les noms de fichiers séparés par des valeurs nulles stdin
.