Come soluzione robusta, usa find
per separare i nomi dei file con un carattere nullo, quindi reindirizzare direttamente a tar
, che legge un input delimitato da null:
find . -maxdepth 1 -name '*.csv' -print0 |
tar -czf archive.tgz --null -T -
Questo ora gestirà tutto correttamente i nomi dei file e non è nemmeno limitato dal numero di file.
Utilizzando ls
generare un elenco di nomi di file che devono essere analizzati da un altro programma è un antipattern comune che dovrebbe essere evitato quando possibile. find
può generare output delimitato da null (-print0
) che la maggior parte delle utilità può leggere o analizzare ulteriormente. Poiché il carattere null è l'unico carattere che non può apparire in un nome di file (e il /
, ovviamente), sarai sempre al sicuro con quello.
No, non puoi accodare un file tar compresso senza prima decomprimerlo.
Tuttavia, tar può accettare il suo elenco di file da elaborare da un file, quindi puoi semplicemente fare:
ls *.csv > temp.txt
tar -zcf ball.tgz -T temp.txt
@slhck sottolinea che la soluzione di cui sopra non funzionerà se ci sono spazi (e probabilmente altri caratteri fastidiosi) nei nomi dei file. Questa versione racchiude ogni nome di file tra virgolette:
ls *.csv | sed -e 's/^\(.*\)$/"\1"/' > temp.txt
tar -zcf ball.tgz -T temp.txt
(Questo ovviamente si interromperà se hai le virgolette doppie nei nomi dei tuoi file, nel qual caso ottieni ciò che ti meriti. :)