Tengo una carpeta con aproximadamente 20K archivos. Los archivos se nombran de acuerdo con el patrón xy_{\d1,5}_{\d4}\.abc
, por ejemplo xy_12345_1234.abc
. Quería comprimir los primeros 10K de ellos usando este comando:
ls | sort -n -k1.4,1.9 | head -n10000 | xargs tar -czf xy_0_10000.tar.gz
sin embargo, el archivo resultante solo tenía unos 2K archivos dentro.
ls | sort -n -k1.4,1.9 | head -n10000 | wc -l
sin embargo, devuelve 10000, como se esperaba.
Me parece que estoy malentendido algo básico aquí ...
Estoy usando zsh 5.0.2 en Linux Mint 17.1, GNU tar 1.27.1
EDITAR:
bifurcación como lo sugiere @Archemar suena muy plausible, con la última bifurcación sobrescribiendo el archivo resultante: el archivo contiene la 'cola' de los archivos: 7773 a 9999 .
resultado 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
Reemplazar -c
con -r
o -u
no funcionó en mi caso. El mensaje de error fuetar: Cannot update compressed archives
usando ambos -r
y -u
es inválido y falla contar: You may not specify more than one '-Acdtrux', '--delete' or '--test-label' option
sustituyendo -c
con -a
parece ser válido también y no con el mismo tar: You must specify one of the '-Acdtrux', '--delete' or '--test-label' options
, aunque yo no reconozco el tema azf
y Acdtrux
parece disjunta a mí.
EDITAR 2:
-T parece una buena manera, también he encontrado un ejemplo aquí .
Sin embargo cuando lo intento
ls | sort -n -k1.4,1.9 | head -n10000 | tar -czf xy_0_10000.tar.gz -T -
yo obtengo
tar: option requires an argument -- 'T'
bueno, tal vez los nombres de los archivos no llegan al alquitrán? Pero parece que lo hacen porque cuando ejecuto
ls | sort -n -k1.4,1.9 | head -n10000 | tar --null -czf xy_0_10000.tar.gz -T -
yo obtengo
tar: xy_0_.ab\nxy_1_...<the rest of filenames separated by literal \n>...998.ab
Cannot stat: File name too long
Entonces, ¿por qué tar no ve los nombres de los archivos?
find
, que tiene la -print0
opción de usar un byte nulo como delimitador en lugar de una nueva línea. sort
puede manejar eso con la -z
bandera. head
, desafortunadamente no maneja los delimitadores de bytes nulos, pero esta respuesta tiene una solución que se usa tr
para intercambiar \n
y \0
antes y después head
. tar
tiene --null -T -
que leer nombres de archivo delimitados por nulos stdin
.