2009-06-22 3 views
3

Ich benutzte diese Zeile, um den Ausdruck 'B206' innerhalb von Dateien in dem Verzeichnis zu finden, in dem ich mich befand, und all seinen Unterverzeichnissen.Unix 'finde' + 'grep' Syntax vs. awk

find . -exec grep -s "B206" '{}' \; -print 

Es stürzt ab, wenn es um bestimmte Dateien zu lesen versucht und tatsächlich ändert die Titelleiste in Kitt zu einer Reihe von seltsamen Zeichen

Zum Beispiel stürzt die ganze Zeit, wenn es eine jpg-Datei trifft, die in ist ein Unterverzeichnis Die Titelleiste ändert, und auf dem Bildschirm existiert:

ÐF»*rkNQeË+Z׳kU£~MÞçÄZ½ªéúýØâÑn¡[U+Þ4ªÒ9/ê£<ú¯4}[IÓ­îÃ¥K»G%ݳ¢ 

mich zwingen zu Ctrl + C auf die Aufforderung aus zurück und beenden Sie dann aus.

Jede Möglichkeit, Code zu dieser Zeile hinzuzufügen, die jpg-Dateien ausschließt? Noch besser, ein Stück Code, wo ich eine Liste von Extensions hinzufügen kann, um sie auszuschließen?


EDIT:
-keine & -I für mich nicht funktionieren
fand ich diese similar question auch etwas zu meinem

+0

was ist Ihre Umgebung? Bash? tcsh? Linux-Distribution? os x? – phi

+0

Wenn Ihr System POSIX-kompatibel ist, können Sie "-not" durch '!' Ersetzen. Wenn die Zeichenfolge, die Sie suchen, immer von Nicht-Wortzeichen umgeben ist (einschließlich Newline), können Sie möglicherweise die ' -w wechselt zu grep [NB: Dieser Schalter wird nicht von POSIX angegeben, also YMMV]. Ich würde auch das 'H' Flag für Grep verwenden, um sicherzustellen, dass es den Dateinamen ausgibt: ' finden. ! -iname "* .jpeg"! -iname "* .jpg"! -iname "* .png" -exec grep -Hw B206 {} \; ' – sanmiguel

Antwort

3

Wenn Ihre Umgebung keine Lust grep tun können, vielleicht Ihre awk kann es tun:

find . | awk '!/((\.jpeg)|(\.jpg)|(\.png))$/ {print $0;}' | xargs grep "B206" 
+0

gewinnen .... wie kann ich grep/find suchen: kann Linien nicht finden? – CheeseConQueso

+0

Können Sie ein Beispiel veröffentlichen? Vielleicht könnte es selbst eine Frage verdienen. – phi

+0

hier gepostet http://stackoverflow.com/questions/1028885/suppress-find-grep-cannot-open-output – CheeseConQueso

2
 
find . -type f -a -not -name \*.jpg -exec grep -li "string" "{}" \; 

Dieses Beispiel stammt aus Mac OSX 10.5, müssen Sie den Fund überprüfen, bezogen Manual-Page für Ihre Umgebung, da es Unterschiede zwischen GNU-Find- und anderen Herstellerimplementierungen gibt. Überprüfen Solaris (nur zum Spaß wurde das Ziel-Betriebssystem nie angegeben):

 
find . -type f -a ! -name \*.jpg -exec grep -li "string" "{}" \; 

Diese Konstruktion findet alle Dateien, deren Namen nicht in .jpg und execs grep für jeden von ihnen.

Abhängig von Ihrer Shell müssen Sie möglicherweise den Knall (!) Umgehen, damit dies wie beschrieben funktioniert.

+0

ich bekomme diesen Fehler -" finde: schlechte Option -nicht " – CheeseConQueso

+0

Sie müssen gfind verwenden – DVK

+0

-ls wird auch nicht verstanden - das ist verrückt – CheeseConQueso

3

Sie -I grep Schalter verwenden:

Process a binary file as if it did not contain matching data; 
this is equivalent to the --binary-files=without-match option. 

Kurz gesagt, grep wird die Datei einfach davon ausgehen, stimmt nicht überein, die von ausgegeben binäre Daten halten wird.

+0

zuallererst, Ihr Name ist großartig ... Zweitens - könnten Sie mir ein Beispiel für die Syntax geben? – CheeseConQueso

+0

Wenn sein Grep nicht '-not' unterstützt, scheint GNU grep nicht verfügbar zu sein und -I ist ein GNU-Zusatz zu grep. – Erik

+0

Err .. Ich meinte natürlich "finden" und nicht "grep". – Erik

1

Wenn Sie Zugriff auf gfind haben, fügen Sie dem Ausdruck einfach "-not-name '* .jpg'" hinzu.

gfind . -not -name '*.jpg' -exec grep -s "B206" '{}' \; -print 

Eine weitere Option (nicht für diese Aufgabe benötigt, aber ein nützlicher Trick) ist, wenn Sie wirklich Lust regexps verwenden möchten, tun

some_easy_high_level_filter_expression -ls finden | perl -pe '{/ your_Perl_RegExp_of_choice /}'> ./files_to_search_in

grep Optionen 'cat ./files_to_search_in'

# sollte vorhergehenden Linie haben Backticks, aber ich kann den Formatierer nicht erhalten Escape

Dies gibt den manchmal benötigten Vorteil der Zwischenspeicherung der Dateiliste für den Fall, dass Sie den Grep-Ausdruck ändern möchten, um es fin-tune oder einfach mehr als 1 Grep tun.

+0

Meine Version weiß nicht, was das ist - nicht. Ich bekomme die schlechte Option Fehler msg – CheeseConQueso

0

grep -r -I "string" *

+0

ich muss eine alte/beschissene Version von Unix .... ich bekomme diese Fehler von diesem Befehl ... grep: illegale Option - ich grep: illegale Option - r – CheeseConQueso

+1

Nur GNU grep kommt mit -r (rekursiv), wahres UNIX grep nicht. Sie müssen entweder GNU grep installieren oder es mit find verwenden. – Terminus

2

ich Erik Befehl versucht, aber ich bekam eine Fehlermeldung über kein -grep Prädikat. Vielleicht ist meine Fundversion zu alt.

Das ist für mich gearbeitet:

find . -type f -a -not -name \*.jpg -exec grep "B206" {} \; 
+0

-nicht funktioniert überhaupt nicht für mich. nicht sicher warum – CheeseConQueso

8

Es gibt keinen Grund find zu verwenden: grep kommt mit einer rekursiven Option, -r. Um nur eine Liste der Dateinamen mit Übereinstimmungen zu erhalten (im Gegensatz zu einer Liste aller übereinstimmenden Zeilen in allen Dateien), können Sie die Option -l verwenden. Wenn Sie alle Binärdateien direkt ignorieren möchten, können Sie die Option --binary-files=without-match verwenden. Wenn Sie nur Dateien mit einer bestimmten Erweiterung ignorieren möchten, können Sie die Option --exclude verwenden, z. --exclude=*.{jpg,jpeg}, um alle Dateien zu ignorieren, die auf .jpg oder .jpeg enden. Daher sollten Sie in der Lage zu bekommen, was Sie mit diesem wollen:

grep -r -l --binary-files=without-match . 

Nun, Sie haben in einem Ihrer Kommentare, die Ihrer Version von grep nicht die -r oder -l Optionen hat. Das ist bedauerlich, und ich empfehle, eine neuere Version von grep (vorzugsweise der Sorte GNU) zu bekommen.

Noch ein Hinweis: Wenn Sie find -exec verwenden, können Sie einen + verwenden sollten Sie den Befehl anstelle eines semicoln zu beenden, zB:

find . -exec grep options '{}' '+' 

Durch eine + verwenden, wird find nur einen einzigen Prozess abzweigen und Übergeben Sie alle übereinstimmenden Dateinamen als Befehlszeilenargumente an eine Instanz von grep. Solange Sie keine Millionen übereinstimmenden Dateien haben (was eine Befehlszeile erzeugen würde, die viel länger ist, als die Shell handhaben kann), wird dies viel, viel schneller sein. Wenn Sie stattdessen ein Semikolon verwenden, gibt find einen neuen Prozess für jede passende Datei, die für eine sehr große Anzahl von Dateien wirklich langsam ist.

+1

Nur GNU grep kommt mit -r (rekursiv), wahres UNIX grep nicht. Sie müssen entweder GNU grep installieren oder es mit find verwenden. – Terminus

1
grep -r --exclude=*.jpg B206 . 

Sorry, von einem anderen Kommentar:

Nur GNU grep kommt mit -r (rekursiv), true UNIX grep nicht. Sie müssen entweder GNU grep installieren oder es mit find verwenden. - Terminus

1

verwenden grep mit find, meine Syntax:

find . -name "*" -print | xargs grep B206 

Alle Optionen zum Filtern von Dateien, binäre und alle, dann werden die Ergebnisse als Argumente für den Befehl grep übergeben werden.

+0

das wird immer noch auf dem jpg hängen – CheeseConQueso

1

Ich denke, das Problem ist, wenn Sie eine Binärdatei grep, gibt es Binärdaten aus. Diese Binärdaten werden irgendwie in Ihrer Shell interpretiert.

Ich würde vorschlagen, zu versuchen, den Befehl "Zeichenfolgen" zu verwenden, die sicherstellen, dass Ihre Ausgabe nur Text ist, und dann grep auf die Ausgabe von "Zeichenfolgen."

3

Nur ein Zitat, Sie müssen das Terminal nicht schließen, Sie können den Befehl reset verwenden, um den Terminal-Ausgabemodus wiederherzustellen.

Sie können auch eine frühere grep tun, um die Erweiterungen zu entfernen, die Sie nicht wollen:

find -print | grep -v '\(\.jpg\|\.bmp\)$' | xargs grep "B206" 
2

Angesichts der letzten Lovefest über ack, ich bin überrascht, dass niemand es noch erwähnt.

Sie können Typen durch Erweiterung konfigurieren, so dass Sie nur die gewünschten Dateien "grep". Oder Sie können einfach --nobinär verwenden, angesichts des Problems, mit dem Sie konfrontiert wurden.