2009-07-09 18 views
2

Je suis intéressé par les scripts bash et j'aimerais savoir comment vous pouvez parcourir un répertoire unix et consigner le chemin d'accès au fichier que vous êtes en train de regarder s'il correspond à un critère regex.Comment puis-je parcourir une arborescence de répertoires à l'aide d'un script bash ou Perl?

Il se présenter comme suit:

  • Traverse un grand fichier chemin du répertoire unix/structure du dossier.
  • Si le de fichier actuel contenu contient une chaîne qui correspond à une ou plusieurs expressions regex,
  • Ensuite, ajoutez le chemin complet du fichier dans un fichier texte des résultats.

scripts Bash ou Perl sont très bien, même si je préférerais que vous devez faire cela à l'aide d'un script bash avec grep, awk, commandes etc.

Répondre

5

utilisation trouver et grep

find . -exec grep -l -e 'myregex' {} \; >> outfile.txt 

-l sur le grep obtient juste le nom du fichier

-e sur le grep spécifie une expression régulière

{} lieux chaque fichier trouvés par la commande find sur la fin de la commande grep

>> outfile.txt ajoute à la fichier texte

+0

-exec grep sera plutôt lent, car il exécute grep pour chaque fichier séparément –

+0

Vous pouvez l'accélérer considérablement avec un signe plus: find. -exec grep -l -e 'myregex' {} + >> outfile.txt –

2

grep -l -R <regex> <location> devrait faire le travail.

+0

-R m'a posé des problèmes auparavant sur certaines versions d'Unix. Si cela fonctionne pour @Brock Woolf alors génial, sinon, il devra utiliser find et grep ensemble – Xetius

+0

C'est une option GNU grep. Si sa version unix ne l'a pas, ce n'est pas trop difficile à installer (politique à part). – pgs

8
find . -type f -print0 | xargs -0 grep -l -E 'some_regexp' > /tmp/list.of.files 

parties importantes:

  • -type f fait la liste de trouver des fichiers que
  • -print0 imprime les fichiers séparés non par \ n mais \ 0 - il est là pour vous assurer qu'il travaillera au cas où vous avez des fichiers avec des espaces dans leurs noms
  • xargs -0 - divise entrée sur \ 0, et passe chaque élément comme argument à la commande que vous avez fourni (grep dans cet exemple)

La chose cool avec l'aide xargs est que si votre répertoire contient vraiment beaucoup de fichiers, vous pouvez accélérer le processus en la comparant:

find . -type f -print0 | xargs -0 -P 5 -L 100 grep -l -E 'some_regexp' > /tmp/list.of.files 

Cela exécutera la commande grep en 5 exemplaires séparés, chaque balayage une autre série de jusqu'à 100 fichiers

+0

J'aime ça. J'aime le fait que vous pouvez faire des commandes aussi simples ou compliquées que vous le souhaitez en fonction de la quantité de puissance que vous voulez utiliser. – Xetius

0
find /path -type f -name "*.txt" | awk ' 
{ 
    while((getline line<$0)>0){ 
     if(line ~ /pattern/){ 
      print $0":"line 
      #do some other things here 
     } 
    }  
}' 

similaires thread

0
find /path -type f -name "outfile.txt" | awk ' 
{ 
    while((getline line<$0)>0){ 
     if(line ~ /pattern/){ 
      print $0":"line 
     } 
    }  
}' 
2

Si vous vouliez faire thi s à partir de Perl, vous pouvez prendre les find commandes que les gens ont suggéré et les transformer en un script Perl avec find2perl:

Si vous avez:

$ find ... 

font que

$ find2perl ... 

que les sorties un programme Perl qui fait la même chose. De là, si vous avez besoin de faire quelque chose de facile en Perl mais dur dans le shell, vous n'avez qu'à étendre le programme Perl.

Questions connexes