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
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
@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