Como una solución robusta, use find
para separar los nombres de archivo por un carácter nulo y luego canalizar directamente a tar
, que lee la entrada delimitada por nulos:
find . -maxdepth 1 -name '*.csv' -print0 |
tar -czf archive.tgz --null -T -
Esto ahora manejará todos nombres de archivos correctamente y tampoco está limitado por la cantidad de archivos.
Usando ls
generar una lista de nombres de archivos para ser analizados por otro programa es un antipatrón común que debe evitarse siempre que sea posible. find
puede generar una salida delimitada por nulos (-print0
) que la mayoría de las utilidades pueden leer o analizar más. Dado que el carácter nulo es el único carácter que no puede aparecer en un nombre de archivo (y el /
, obviamente), siempre estarás seguro con eso.
No, no puede agregar a un archivo tar comprimido sin descomprimirlo primero.
Sin embargo, tar puede aceptar su lista de archivos para procesar desde un archivo, por lo que solo puede hacer:
ls *.csv > temp.txt
tar -zcf ball.tgz -T temp.txt
@slhck señala que la solución anterior no funcionará si hay espacios (y probablemente otros caracteres molestos) en sus nombres de archivo. Esta versión encierra cada nombre de archivo entre comillas dobles:
ls *.csv | sed -e 's/^\(.*\)$/"\1"/' > temp.txt
tar -zcf ball.tgz -T temp.txt
(Por supuesto, esto se romperá si tiene comillas dobles en sus nombres de archivo, en cuyo caso obtendrá lo que se merece. :)