2016-04-14 6 views
0

Also was ich tun muss, ist alle regulären Dateien innerhalb und unterhalb des Verzeichnisses zu finden. Für jede dieser regulären Dateien muss ich für Muster ($ ARG) egrep und herausfinden, ob die Ausgabe der Datei mit dem Muster ($ ARG) übereinstimmt, wenn es tut, wird es eins zum Zähler hinzufügen.Shell, wie man einen Befehl für jede Datei in einem Verzeichnis verwendet

Was ich habe, so weit ist die Datei Befehl:

$count = 0 
file * 

Aber ich habe Probleme egrep bekommen & ARG>/dev/null /; echo $? um jede Datei zu durchlaufen, die von (Datei *) erscheint.

Ich verstehe diese Datei * | Verzeichnis egrep>/dev/null; echo $? gibt 0 aus, weil es das Muster "Verzeichnis" in der Datei findet, aber ich habe Probleme, es durch jede reguläre Datei zu durchlaufen, so dass ich jedes Mal, wenn das Muster übereinstimmt, eins zum Zähler hinzufügen kann.

Antwort

1

Die Frage ist nicht klar, aber wenn Sie nach Anzahl der Dateien, die ein Muster

grep -l "pattern" * 2>/dev/null | wc -l 

geben Ihnen das suchen. Fehler werden aus Verzeichnissen ignoriert.

Wenn Sie möchten, tun rekursiv den kompletten Baum einschließlich Punkt-Dateien

grep -r -l "pattern" | wc -l 
+0

Sie brauchen '-r', um in Unterverzeichnisse zu springen. – Barmar

+0

ja, richtig. hinzugefügt – karakfa

+0

@Aleksej: Darf ich Sie fragen, warum genau Sie meine Antwort gelöscht haben? Du hast behauptet, dass es keine Antwort auf die Frage gegeben hat. Meiner Meinung nach hat das OP um ein Programm gebeten, um ein bestimmtes Problem zu lösen, und ich habe eins veröffentlicht. Wenn Sie meinen, dass mein Programm die Anforderungen des OP nicht erfüllt (was natürlich möglich ist - ich habe nie behauptet, keine Fehler in der Programmierung zu machen), wäre es besser gewesen, wenn Sie stattdessen auf diesen Fehler hingewiesen hätten. – user1934428

0

Sie können dies versuchen:

counter=0 
find /path/to/directory/ -type f | \ 
    while read file 
    do 
     if grep -i -e -q "$pattern" "$file" 
     then counter=$((counter+1)) 
     fi 
    done 
echo "$counter" 
+0

$ counter wird immernoch Null sein, weil die while-Schleife in einer Pipeline ist –

+0

Außerdem haben Sie '-q' als Argument für' -e' –

+0

-q bezeichnet exit mit 0, wenn Übereinstimmung gefunden wurde, und wenn dann eine Übereinstimmung gefunden wird Der Zähler wird inkrementiert. Ich habe die eckigen Klammern der if-sonst-Bedingung übersprungen, um den Code sauberer zu machen. – kintuparantu

0

http://mywiki.wooledge.org/BashFAQ/020

counter=0 
shopt -s globstar nullglob 
for file in **; do 
    grep -qiE "$pattern" "$file" && ((counter++)) 
done 
echo "$counter" 

sehen, wenn Sie versteckte Dateien einschließen möchten , hinzufügen shopt -s dotglob

Verwandte Themen