Suchen Sie alle Dateien mit einem Namen, der eine Zeichenfolge enthält


177

Ich habe nach einem Befehl gesucht, der Dateien aus dem aktuellen Verzeichnis zurückgibt, die eine Zeichenfolge im Dateinamen enthalten. Ich habe gesehen locateund findBefehle, die Dateien finden können, die mit etwas beginnen first_word*oder mit etwas enden *.jpg.

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.markdownsich eine Datei im aktuellen Verzeichnis befand.

Wie kann ich diese und andere Dateien mit der Zeichenfolge zurückgeben touch? Verwenden eines Befehls wiefind '/touch/'


Die Frage ist verwirrend. Möchten Sie Dateien finden, die eine Zeichenfolge enthalten, oder Dateien, deren Namen diese Zeichenfolge enthalten? Die erste Frage wird mit beantwortet man grep, die zweite mit man find. Warum sollten Sie googeln, anstatt Mann zu verwenden? Ich weiß es nicht.
Nur jemand

1
Vielen Dank! Im ersten Satz wurde nicht angegeben, ob es sich um einen Dateiinhalt oder einen Dateinamen handelt. Aktualisiert.
Dru

Antworten:


303

Verwendung find:

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

Es findet alle Dateien im aktuellen Verzeichnis (löschen, maxdepth 1wenn Sie es rekursiv möchten), die "Zeichenfolge" enthalten, und druckt es auf dem Bildschirm.

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

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

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

ls | grep touch

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


Danke @Zagorax. Das macht es genau. Ich wünschte, der Befehl wäre nicht so lang, aber ayee :)
Dru

2
@Dru, Geändert, um den Fall abzudecken, wenn Sie Doppelpunkte vermeiden möchten. findist ein sehr mächtiges Werkzeug, es muss irgendwie "lang" sein. :)
Zagorax

Vielen Dank, der erste hat es perfekt gemacht, ohne Inhalte zurückzugeben.
Dru

3
@Dru, wenn Sie es "kürzer" möchten, können Sie dies vermeiden, -printda dies das Standardverhalten ist und .dies der Standardordner ist, in dem es überprüft wird.
Zagorax

1
find . -name "*string*"Funktioniert auch super. Das Entfernen .wirft einen Fehler auf mein Ende. Nochmals vielen Dank @Zagorax.
Dru

14

Verwenden Sie grep wie folgt:

grep -R "touch" .

-Rbedeutet rekursiv. Wenn Sie lieber nicht in die Unterverzeichnisse gehen möchten, überspringen Sie diese.

-ibedeutet "Fall ignorieren". Vielleicht ist dies auch einen Versuch wert.


Toll. Mir ist aufgefallen, dass einige Dateiinhalte a folgen :. Gibt es überhaupt etwas, um das zurückzuhalten? Vielleicht eine Option verwenden?
Dru

1
Versuchen Sie:grep -R "touch" . | cut -d ":" -f 2
Carlspring

Das scheint nur den Inhalt der Dateien zu produzieren. Sie haben meine Frage im Wesentlichen beantwortet. Ich kann versuchen, etwas zu graben, um den Inhalt zurückzuhalten.
Dru

Ah ... brauchen Sie nur die Dateinamen? Run: grep -R "touch" . | cut -d ":" -f 1 (Entschuldigung, ich muss dich falsch verstanden haben).
Carlspring

Danke @carlspring das ist interessant. grepEntweder gibt ich Dateien mit Inhalten und Dateinamen zurück touchoder Inhalte, die enthalten touch. Ich bin mir noch nicht sicher, was der Fall ist. Von der Liste der zurückgegebenen Dateien enthält touchdie Hälfte den Titel und die andere Hälfte den Text touch, nicht den Titel. Hab das gerade gemerkt.
Dru

5

Die -maxdepthOption sollte -namewie unten vor der Option stehen.

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

1
Sie müssen * vor und nach dem "String" setzen.
Aerin

3
find $HOME -name "hello.c" -print

Dadurch wird das gesamte $HOME(dh /home/username/) System nach Dateien mit dem Namen "hello.c" durchsucht und deren Pfadnamen angezeigt:

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

Es wird jedoch nicht übereinstimmen HELLO.Coder HellO.C. Wenn Sie die Groß- und Kleinschreibung nicht berücksichtigen, übergeben Sie die -inameOption 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 -type fOption, 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

Die Funktion -inamefunktioniert entweder mit dem Befehl find der Version GNU oder BSD (einschließlich OS X). Wenn Ihre Version des Befehls find dies nicht unterstützt -iname, versuchen Sie die folgende Syntax mit dem grepBefehl:

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

0

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

$ compgen -f .bash
.bashrc
.bash_profile
.bash_prompt

3
compgenist kein geeigneter Hammer für diesen Nagel. Dieses wenig genutzte Tool wurde entwickelt, um verfügbare Befehle aufzulisten. Als solches listet es Dateien im aktuellen Verzeichnis auf (bei denen es sich um Skripte handeln kann) und kann weder den Anfang eines Dateinamens rekursieren noch über den Anfang hinausschauen oder den Inhalt der Datei durchsuchen meistens nutzlos.
Msanford

0

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

**/bar

führt eine rekursive Verzeichnissuche nach benannten Dateien durch bar(möglicherweise einschließlich der Datei barim aktuellen Verzeichnis). Beachten Sie, dass dies nicht mit anderen Formen des Globbens innerhalb desselben Pfadsegments kombiniert werden kann. In diesem Fall *kehren die Bediener zu ihrer üblichen Wirkung zurück.

Beachten Sie, dass es einen subtilen Unterschied zwischen zshund bashhier gibt. Während bashSoft-Links zu Verzeichnissen durchlaufen werden, zshwird dies nicht der Fall sein. Dafür müssen Sie den Glob ***/in verwenden zsh.


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

1
Diese Antwort wurde für schlechte Qualität gekennzeichnet. Bitte erläutern Sie, was Ihre vorgeschlagenen Änderungen bewirken.
Miroslav Glamuzina

-2
grep -R "somestring" | cut -d ":" -f 1

2
Dies scheint eine Antwort auf eine andere Frage zu sein - aber da Sie keine Erklärung geliefert haben, ist dies für den Fragesteller oder für andere Personen nicht offensichtlich.
Toby Speight
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.