it-swarm.com.de

Finden Sie alle Dateien, deren Name eine Zeichenfolge enthält

Ich habe nach einem Befehl gesucht, der Dateien aus dem aktuellen Verzeichnis zurückgibt, die eine Zeichenfolge im Dateinamen enthalten. Ich habe locate und find Befehle gesehen, die Dateien finden können, die mit etwas first_Word* Beginnen oder mit etwas *.jpg Enden.

Wie kann ich eine Liste von Dateien zurückgeben, die eine Zeichenfolge im Dateinamen enthalten?

Zum Beispiel, wenn 2012-06-04-touch-multiple-files-in-linux.markdown Eine Datei im aktuellen Verzeichnis war.

Wie kann ich diese und andere Dateien mit der Zeichenfolge touch zurückgeben? Mit einem Befehl wie find '/touch/'

149
Dru

Verwenden Sie find:

find . -maxdepth 1 -name "*string*" -print

Es werden alle Dateien im aktuellen Verzeichnis gefunden (delete maxdepth 1 wenn Sie wollen, dass es rekursiv ist), enthält "string" und druckt es auf dem Bildschirm aus.

Wenn Sie vermeiden möchten, dass eine Datei ':' enthält, können Sie Folgendes eingeben:

find . -maxdepth 1 -name "*string*" ! -name "*:*" -print

Wenn Sie grep verwenden möchten (aber ich denke, es ist nicht erforderlich, solange Sie den Dateiinhalt nicht überprüfen möchten), können Sie Folgendes verwenden:

ls | grep touch

Aber ich wiederhole, find ist eine bessere und sauberere Lösung für Ihre Aufgabe.

247
Zagorax

Verwenden Sie grep wie folgt:

grep -R "touch" .

-R bedeutet Rekurs. Wenn Sie nicht in die Unterverzeichnisse gehen möchten, überspringen Sie es.

-i bedeutet "Groß-/Kleinschreibung ignorieren". Vielleicht ist dies auch einen Versuch wert.

13
carlspring

Die Option -maxdepth Sollte vor der Option -name Stehen (siehe unten).

find . -maxdepth 1 -name "string" -print
4
Sunil Dias
find $HOME -name "hello.c" -print

Dies durchsucht das gesamte System $HOME (D. H. /home/username/) Nach Dateien mit dem Namen "hello.c" und zeigt deren Pfadnamen an:

/Users/user/Downloads/hello.c
/Users/user/hello.c

Es stimmt jedoch nicht mit HELLO.C Oder HellO.C Überein. Um eine Übereinstimmung zwischen Groß- und Kleinschreibung zu erzielen, übergeben Sie die Option -iname Wie folgt:

find $HOME -iname "hello.c" -print

Beispielausgaben:

/Users/user/Downloads/hello.c
/Users/user/Downloads/Y/Hello.C
/Users/user/Downloads/Z/HELLO.c
/Users/user/hello.c

Übergeben Sie die Option -type f, Um nur nach Dateien zu suchen:

find /dir/to/search -type f -iname "fooBar.conf.sample" -print
find $HOME -type f -iname "fooBar.conf.sample" -print

Der -iname Funktioniert entweder mit dem Befehl GNU oder BSD (einschließlich OS X) version find. Wenn Ihre Version des Befehls find -iname Nicht unterstützt, versuchen Sie Folgendes Syntax mit dem Befehl grep:

find $HOME | grep -i "hello.c"
find $HOME -name "*" -print | grep -i "hello.c"

Oder Versuche

find $HOME -name '[hH][eE][lL][lL][oO].[cC]' -print

Beispielausgaben:

/Users/user/Downloads/Z/HELLO.C
/Users/user/Downloads/Z/HEllO.c
/Users/user/Downloads/hello.c
/Users/user/hello.c
2
shilovk
grep -R "somestring" | cut -d ":" -f 1
0
Saurabh kukade

Eine Alternative zu den vielen bereits angebotenen Lösungen ist die Verwendung des Glob **. Wenn Sie bash mit der Option globstar (shopt -s globstar) oder Sie benutzen zsh, können Sie einfach den Glob ** dafür.

**/bar

führt eine rekursive Verzeichnissuche nach Dateien mit dem Namen bar durch (möglicherweise einschließlich der Datei bar im aktuellen Verzeichnis). Beachten Sie, dass dies nicht mit anderen Formen des Globbing innerhalb desselben Pfadsegments kombiniert werden kann. in diesem Fall ist der * Operatoren kehren zu ihrer normalen Wirkung zurück.

Beachten Sie, dass es hier einen subtilen Unterschied zwischen zsh und bash gibt. Während bash Softlinks zu Verzeichnissen durchläuft, wird zsh dies nicht tun. Dazu muss das glob ***/ in zsh.

0
kvantour
find / -exec grep -lR "{test-string}" {} \;
0
Shahid

Befindet sich die Zeichenfolge am Anfang des Namens, können Sie dies tun

$ compgen -f .bash
.bashrc
.bash_profile
.bash_Prompt
0
Steven Penny