2016-05-04 27 views
2

Ich schreibe in einer Datei NotEmpty.txt all meine nicht leeren Text-Dateien in einem Verzeichnis dir mit dem folgenden Befehl:Wie grep nur die passende Regex?

find dir/ -not -empty -ls | grep -E "*.txt" > NotEmpty.txt 

Ich möchte nur die passende Regex drucken, und nicht alle die Informationen auf der Linie. Wie ist es möglich?

+0

So Sie nur Dinge wie 'dir/filename.txt' drucken? Btw * .txt wird die ganze Linie :) –

Antwort

2

Das Problem ist, dass Sie ls gegen jede Übereinstimmung ausführen, so dass die Ausgabe eine Menge Zeug enthält. Verwenden Sie stattdessen diesen Befehl find, um den Namen zu drucken.

Hinweis, in der Tat, dass Sie alles in einem Schuss, einschließlich der Auswahl nur .txt Dateien tun können:

find your_dir/ -not -empty -name "*.txt" -print > NotEmpty.txt 
#       ^^^^^^^^^^^^^ ^^^^^^ 
#         |   | 
#       just .txt files | 
#           | 
#        print its name instead of `ls`ing it 

Sie können auch -type f sagen, nur Dateien zu überprüfen, die in der Tat denke ich es angenommen wird, der -not -empty Parameter.

+1

Danke, es funktioniert! – bam500

1

Verwenden Sie den Parameter -o von grep, um anzugeben, dass Sie nur den passenden Teil haben möchten.

Beispiel:

$ echo foo bar baz | grep -o "foo" 
foo 
+0

Der Parameter '-o' funktioniert nicht mit dem Parameter -E (für regex). Beispiel: 'echo foo.txt bar.txt baz.txt | grep -oe "* .txt" 'gibt: ' .txt .txt .txt' Ich frage mich, wie es möglich mit regex machen – bam500

+1

@ bam500 - es ist sicherlich mit -E funktioniert. Es ist wahrscheinlich, dass Sie nicht das richtige Ergebnis erhalten, weil Ihre Regex falsch formatiert ist ('* .txt' ist ein Glob-Ausdruck, kein regulärer Ausdruck). Sie müssen '. * \. Txt' für eine Regex verwenden. –

+0

Oh, du hast Recht! Danke für die kleine Erklärung. Ich muss mehr über Regex lesen und wie man sie benutzt! – bam500