2017-05-27 1 views
1

Ich versuchte, die Markdown-Dateien enthält einige spezifische Text unter dem Arbeitsverzeichnis zu suchen, so habe ich den folgenden Befehl ein:Warum druckt Grep "Keine solche Datei oder Verzeichnis"?

find . -name "*.md" | xargs grep "interpretation" 

Doch obwohl ich das Ergebnis bekam, was ich brauche, das Terminal auch viel Fehler auszudrucken unten wie:

grep: Problem: No such file or directory 
grep: Solving: No such file or directory 
grep: with: No such file or directory 
grep: Algorithms: No such file or directory 
…… 
etc 

schrieb ich meine Lösung als unten Antwort.

+1

, wenn Sie Dateien nur im aktuellen Verzeichnis suchen möchten, ohne nach innen zu gehen sub-dirs, benutze einfach 'grep 'interpretation' * .md' ... und wenn du auch sub-dir brauchst, benutze' -type f' und '-exec' mit' find' anstelle von xargs – Sundeep

+0

@Sundeep, Vielen Dank! Ich habe die Verwendung von '-exec' durchsucht und es ist praktisch! Ich werde meine Antwort aktualisieren. Ich bin ein frischer Mann auf der Kommandozeile, sorry dafür :) – Hmgqzx

+0

mit der Befehlszeile ist nie endende Erfahrung ... Sie möchten vielleicht Lesezeichen https://unix.stackexchange.com/questions/321697/why-islooping -over-founds-output-bad-practice, wenn du 'find' regelmäßig verwenden willst – Sundeep

Antwort

1

Es gefunden!

Zuerst habe ich die Option -s Fehler zu unterdrücken, die von here vorgeschlagen, aber @Kelvin 's Kommentar erinnerte mich der wahre Grund ist, dass meine vielen Dateien die Namen der spaces hat.

So um den richtigen Befehl:

$ find . -name "*.md" -print0 | xargs -0 grep "some-text-want-to-find" (auf os x)

hier etwas deutlichere Erklärung gefunden:

Unix-ähnliche Systeme ermöglichen spaces eingebettet (und sogar Zeilenumbrüche!) in Dateinamen. Dies verursacht Probleme für Programme wie xargs, die Argumentlisten für andere Programme erstellen. Ein eingebetteter space wird als Trennzeichen behandelt und der resultierende Befehl interpretiert jedes durch Leerzeichen getrennte Wort als separates Argument. Um dies zu umgehen, ermöglichen find und xarg die optionale Verwendung eines null Charakters als Argumenttrennzeichen. Ein null Zeichen ist in ASCII als das Zeichen definiert, das durch die Zahl Null repräsentiert wird (im Gegensatz zu beispielsweise dem Zeichen space, das in ASCII als das durch die Zahl 32 dargestellte Zeichen definiert ist). Der Befehl find liefert die Aktion -print0, die den getrennten Ausgang null erzeugt, und der Befehl xargs hat die Option –null, die den getrennten Eingang null akzeptiert.

- Die Linux-Befehlszeile: Eine komplette Einführung von William E. Shotts

Warnung: Wenn Sie auf os x sind, getrennt die Nulloption von xargs Befehl –0

ist

2017-05-27 Aktualisiert 22:58:48

Dank @Sundeep, wer schlug mir vor, -exec, ein neues Feature in find selbst zu verwenden, anstatt xargs.

diese So verwenden Dateien im aktuellen Verzeichnis und dessen Unter dirs suchen:

$ find . -type f -name "*.md" -exec grep "some-text-want-to-find" {} + 

Hinweis:

What is meaning of {} + in find's -exec command? - Unix & Linux Stack Exchange

Verwandte Themen