2016-05-20 4 views
0

J'ai une situation où il y a différents types de fichiers (d'extension différente) dans certains des répertoires. Je n'ai aucune idée du type de fichier présent dans un répertoire particulier. Supposons le cas suivant:Comment analyser les fichiers en fonction de leur extension

Il y a un chemin commun à tous les cinq répertoires 1, 2, 3, 4, 5 comme:

/dir1/dir2/dir3/1/ 
/dir1/dir2/dir3/2/ 
/dir1/dir2/dir3/3/ 
/dir1/dir2/dir3/4/ 
/dir1/dir2/dir3/5/ 

En bref, 1, 2, 3, 4, 5 sont en dir3.

À titre d'exemple,
répertoires 1 et 3 ont des fichiers avec l'extension txt
répertoires 2, 4, 5 ont des fichiers avec l'extension .gz

Je fais cela dès maintenant :

while [ $a -le 5 ] 
    do 
     cat /dir1/dir2/dir3/"$a"/*.txt | grep "string" > /path/output"$a" 
     zcat -f /dir1/dir2/dir3/"$a"/*.gz | grep "string" > /path/output"$a" 
     ((a++)) 
    done 

Les sorties sont créées mais peu d'entre elles sont vides. Je suis sûr que les entrées ont cette chaîne que j'ai utilisé dans grep. Je pense que le script que j'utilise écrase les fichiers.

Comment puis-je effectuer cela en recherchant d'abord l'extension de fichier et en exécutant cat ou zcat en conséquence? Veuillez suggérer?

Edit:

J'ai aussi essayé ce qui suit:

while [ $a -le 5 ] 
    do 

for f in /dir1/dir2/dir3/"$a"/*.txt 
    do 
     cat $f | grep "string" > /path/output"$a" 
    done 
for f in /dir1/dir2/dir3/"$a"/*.gz 
    do 
     cat $f | grep "string" > /path/output"$a" 
    done 

done 
+0

La tentative de modification devrait fonctionner tant que vous utilisez 'shopt -s nullglob'. Cela empêche l'entrée de l'une ou l'autre des boucles 'for'. Si, pour une raison quelconque, vous finissez avec les fichiers 'gz' et' txt' dans le même répertoire, le résultat de la boucle 'gz' écrasera le résultat de la boucle' txt'. – chepner

+0

@chepner Oui. Cela fonctionne très bien si je redirige la sortie vers différents répertoires - un pour .txt et un pour .gz. – intruder

Répondre

1

Ramassez tous les fichiers txt dans un tableau, et si ce tableau n'est pas vide, exécutez cat. Sinon, exécutez zcat. La sortie de celui qui s'exécute est redirigée vers le fichier de sortie.

shopt -s nullglob 
for d in 1 2 3 4 5; do 
    txt=(/dir1/dir2/dir3/"$d"/*.txt) 
    if ((${#txt[@]})); then 
     grep "string" "${txt[@]}" 
    else 
     zcat -f /dir1/dir2/dir3/"$a"/*.gz | grep "string" 
    fi > /path/output/"$d" 
done