2010-09-06 7 views
1

J'ai un script dont j'ai besoin pour exécuter un grand nombre de fichiers avec l'extension **. Tar.gz *. Au lieu de les décompresser et d'exécuter le script, je veux pouvoir les décompresser lorsque j'exécute la commande, puis travailler sur le dossier non compressé, le tout avec une seule commande.décompresser un grand nombre de fichiers à la volée

Je pense qu'un tuyau est une bonne solution pour cela mais je ne l'ai pas utilisé auparavant. Comment ferais-je cela?

Répondre

1

Les -v commandes tar d'imprimer les noms de fichiers comme il extrait chaque fichier:

tar -xzvf file.tar.gz | xargs -I {} -d\\n myscript "{}" 

De cette façon, le script contiendra des commandes pour traiter un seul fichier, passé en paramètre (grâce à xargs) à votre script ($1 dans le contexte du script).

Éditer: la partie -I {} -d\\n va le faire fonctionner avec des espaces dans les noms de fichiers.

+0

-c et -z? et pas d'argument à -f? – strager

+0

@strager désolé je fixais que – aularon

+0

'-v' vous donnera une liste de chaque fichier développé. @sfactor voulait que son script "travaille sur le dossier non compressé" probablement pour chacun des fichiers '* .tar.gz' (que vous devrez ajouter à votre commande' tar'). – Johnsyweb

0

Vous pouvez utiliser une boucle:

for file in *.tar.gz; do tar -xf "$file"; your commands here; done 

ou Étendues:

for file in *.tar.gz; do 
    tar -xf "$file" 
    # your commands here 
done 
+2

si vous ne citez pas $ file, cela échouera pour tous les noms de fichiers contenant des espaces. –

+0

@static_rtti, C'est le mal! Mais tu as raison; Merci. – strager

1

Voici trois lignes de bash ...

for archive in *.tar.gz; do 
    tar zxvf "${archive}" 2>&1 | sed -e 's!x \([^/]*\)/.*!\1!' | sort -u | xargs some_script.sh 
done 

... itérera plus chaque archive compressée dans le répertoire courant, décompressez-la, récupérez les répertoires les plus élevés du contenu décompressé et passez-les sous argu ments à somescript.sh. Cela utilise probablement plus de tuyaux que ce que vous attendiez, mais semble faire ce que vous demandez. N.B: tar xf ne peut prendre qu'un seul fichier par appel.

Questions connexes