Comme solution robuste, utilisez find
pour séparer les noms de fichiers par un caractère nul, puis diriger directement vers tar
, qui lit une entrée délimitée par null :
find . -maxdepth 1 -name '*.csv' -print0 |
tar -czf archive.tgz --null -T -
Cela va maintenant gérer tous nomme correctement les fichiers et n'est pas non plus limité par le nombre de fichiers.
Utiliser ls
générer une liste de noms de fichiers à analyser par un autre programme est un anti-modèle courant qui doit être évité autant que possible. find
peut générer une sortie délimitée par null (-print0
) que la plupart des utilitaires peuvent lire ou analyser davantage. Étant donné que le caractère nul est le seul caractère qui ne peut pas apparaître dans un nom de fichier (et le /
, évidemment), vous serez toujours en sécurité avec ça.
Non, vous ne pouvez pas ajouter à un fichier tar compressé sans le décompresser au préalable.
Cependant, tar peut accepter sa liste de fichiers à traiter à partir d'un fichier, vous pouvez donc simplement faire :
ls *.csv > temp.txt
tar -zcf ball.tgz -T temp.txt
@slhck souligne que la solution ci-dessus ne fonctionnera pas s'il y a des espaces (et probablement d'autres caractères gênants) dans vos noms de fichiers. Cette version met chaque nom de fichier entre guillemets :
ls *.csv | sed -e 's/^\(.*\)$/"\1"/' > temp.txt
tar -zcf ball.tgz -T temp.txt
(Cela cassera bien sûr si vous avez des guillemets doubles dans vos noms de fichiers, auquel cas vous obtenez ce que vous méritez. :)