2017-10-08 1 views
0

J'ai files.tar.gz avec un tas de fichiers CSV à l'intérieur, chacun ayant un en-tête. Je veux faire une boucle sur les fichiers csv et les traiter un à la fois. Si je les ai tous, alors je ne serai pas en mesure d'identifier le début de chaque fichier, et donc son en-tête.Boucle sur les fichiers dans tar.gz

Comment faire une boucle sur les fichiers de l'archive un à la fois et les acheminer individuellement vers une commande de traitement?

Répondre

2

L'utilitaire GNU tar peut extraire fichier individuel à partir d'une archive à stdout avec

tar -O -x -z -f archive.tgz file

Voici une boucle qui pourrait résoudre votre problème, en supposant l'exécution tar pour chaque fichier est extrêmement lents.

tar tzf files.tar.gz | while IFS= read -r f ; do 
    echo ">>> Processing file $f" 
    tar Oxzf files.tar.gz "$f" | head | cat -n ; 
done 

command | while IFS= read -r line est un motif de bash. L'effacement de la variable IFS est nécessaire pour que le code fonctionne correctement lorsqu'il y a des espaces dans les noms de fichiers.

+1

C'est la mauvaise façon d'itérer sur la sortie d'une commande; voir [Bash FAQ 001] (http://mywiki.wooledge.org/BashFAQ/001). – chepner