2009-07-09 3 views
2

Ich interessiere mich für Bash Scripting und möchte wissen, wie Sie ein Unix-Verzeichnis durchqueren und den Pfad zu der Datei, die Sie gerade betrachten, protokollieren können, wenn sie einem Regex-Kriterium entspricht.Wie kann ich einen Verzeichnisbaum mit einem Bash- oder Perl-Skript durchlaufen?

Es würde so gehen:

  • Traverse eine große Unix-Verzeichnispfad, Datei/Ordner-Struktur.
  • Wenn die aktuelle Datei Inhalt eine Zeichenfolge enthalten, die eine abgestimmte oder mehrere Regex Ausdrücke,
  • anschließend den vollständigen Pfad zu einer Ergebnistextdatei die Datei anhängen.

Bash oder Perl-Skripte sind in Ordnung, obwohl ich würde es vorziehen, wie Sie dies mit einem Bash-Skript tun würde, mit grep, awk, etc Befehle.

Antwort

5

Verwendung finden und

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

-l grep auf das grep nur den Namen Datei bekommt

-e auf dem grep gibt einen regulären Ausdruck

{} Orte jede Datei durch den Befehl find auf der gefunden Ende des Befehls grep

>> outfile.txt hängt an die Textdatei

+0

-exec grep wird ziemlich langsam sein, da es grep für jede Datei einzeln ausführt –

+0

Sie können es erheblich beschleunigen mit einem Pluszeichen: finden. -exec grep -l -e "myregex" {} + >> outfile.txt –

2

grep -l -R <regex> <location> sollte den Job erledigen.

+0

-R hat mir Probleme bei bestimmten Versionen von Unix gegeben. Wenn es für @Brock Woolf funktioniert, dann toll, ansonsten muss er find und grep zusammen verwenden. – Xetius

+0

Es ist eine GNU grep Option. Wenn seine Unix-Version es nicht hat, ist es nicht zu schwer zu installieren (Politik beiseite). – pgs

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

Wichtige Teile:

  • -type f der Liste Suchen macht nur Dateien
  • -print0 die Dateien nicht durch \ getrennt druckt n aber durch \ 0 - es ist hier sicher zu machen, für den Fall, arbeiten Sie Dateien mit Leerzeichen im Namen
  • xargs -0 haben - teilt Eingang auf \ 0 und geht jedes Element als Argument für den Befehl, den Sie (grep in diesem Beispiel) vorgesehen

Die kühle Sache mit der Verwendung von xargs ist, dass, wenn Ihr Verzeichnis enthält wirklich eine Menge von Dateien, können Sie den Prozess durch Parallelisierung beschleunigen können:

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

Dies wird den Befehl grep in 5 separaten Kopien läuft, jede Abtastung ein weiterer Satz von bis zu 100 Dateien

+0

Ich mag das. Ich liebe die Tatsache, dass Sie Befehle so einfach oder kompliziert machen können, wie Sie wollen, abhängig von der Menge an Energie, die Sie verwenden möchten. – 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 
     } 
    }  
}' 

ähnlich thread

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

Wenn Sie wollten thi tun s aus Perl, können Sie die find Befehle nehmen, dass die Menschen vorgeschlagen und sie in einen Perl-Skript mit find2perl:

Wenn Sie:

$ find ... 

, dass

$ find2perl ... 

Dem Ausgang ein Perl-Programm, das das Gleiche macht. Von dort aus, wenn Sie in Perl etwas Einfaches machen müssen, aber hart in der Shell, erweitern Sie einfach das Perl-Programm.

Verwandte Themen