Befehl, Dateien zu finden, indem nur ein Teil ihres Namens durchsucht wird?


32

Angenommen, es gibt Dateien mit Namen:

batman.c
debate.c
cricketbat.c

Welchen Befehl und wie soll ich ihn verwenden, um alle diese Dateien mithilfe des Suchtags aufzulisten bat?


5
Möchten Sie übereinstimmende Dateien nur im aktuellen Verzeichnis auflisten? in irgendeinem Verzeichnis am oder unter dem aktuellen Verzeichnis? irgendwo auf dem System?
Steeldriver

Antworten:


47

Suchen von Dateien mit batAnywhere

Um alle Dateien zu finden, /path/to/folderderen Namen enthalten bat, können Sie Folgendes verwenden:

find /path/to/folder -name '*bat*'

Ich habe zitierte das Suchmuster , *bat*weil, wenn die Anführungszeichen weggelassen wurden und Dateien entsprechen *bat*im aktuellen Verzeichnis, wird die Shell erweitert *bat*in eine Liste von ihnen und passiert , dass zu find. Dann findwürde es nicht richtig funktionieren. ( \*bat\*und "*bat*"auch arbeiten.)

Um in dem Ordner zu suchen, in dem Sie sich gerade befinden (z. B. den Sie bearbeitet haben cd), verwenden Sie .wie gewohnt:

find . -name '*bat*'

Verwenden Sie,/ um Ihren gesamten Computer zu durchsuchen . Verwenden Sie ~oder den vollständigen Namen Ihres Basisverzeichnisses, um in Ihrem Basisverzeichnis zu suchen . ( Die Shell wird~ auf den vollständig qualifizierten Pfad Ihres Basisverzeichnisses erweitert .)

Erweitern oder Eingrenzen Ihrer Suche basierend auf dem Namen

Wenn Sie case-insensitiv suchen wollen, so Dateien enthält BAT, bAtund so weiter angepasst sind, verwenden Sie den -inameTest anstelle des -nameTests:

find /path/to/folder -iname '*bat*'

Ich habe festgestellt, dass alle Ihre Dateien auf enden .c. Wenn Sie nur solche Dateien finden möchten, verwenden Sie:

find /path/to/folder -name '*bat*.c'

Mir ist aufgefallen, dass alle Dateinamen batentweder ganz am Anfang oder ganz am Ende des Teils vor dem .cSuffix stehen. Wenn Sie vermeiden möchten, dass Dateien übereinstimmen embattled.c, können Sie Folgendes verwenden:

find /path/to/folder -name '*bat.c' -o -name 'bat*.c'

-oist der Operator oder .

Nur Dateien abgleichen

Verwenden Sie diese Option, um nur normale Dateien und keine Ordner, symbolischen Links und speziellen Geräteknoten zu finden -type f. Dies wird häufig empfohlen und ist manchmal durchaus angemessen, aber häufig nicht das, was Sie wirklich wollen , insbesondere, wenn Sie finddie Ausgabe selbst überprüfen möchten . Wenn Sie einen symbolischen Link hätten , der Ihrer Suche entspricht, möchten Sie nichts darüber wissen?

Wenn Sie sowohl reguläre Dateien als auch symbolische Links suchen möchten, können Sie Folgendes verwenden:

find /path/to/folder -name '*bat*' \( -type f -o -type l \)

Dabei werden der -oOperator und auch Klammern für die Gruppierung verwendet (diese müssen in Anführungszeichen gesetzt werden, damit die Shell sie nicht speziell behandelt; andernfalls wird ein Syntaxfehler angezeigt).

Angenommen, Sie möchten nur symbolische Links sehen, die letztendlich auf eine reguläre Datei verweisen (und keine symbolischen Links zu Verzeichnissen, Geräteknoten usw.). Das ist eigentlich noch einfacher: Verwenden Sie -xtypestatt -type. Sofern Sie nicht aktiv findmit -LFlagge, -xtypeauf einen symbolischen Link testet den Typ der Datei zu der Link verweist.

find /path/to/folder -name '*bat*' -xtype f

Wenn Sie einen Symlink zu einem anderen Symlink zu einer Datei haben, -xtype fwird dieser zugeordnet, obwohl das direkte Ziel ein anderer Symlink anstelle einer regulären Datei ist. Das ist fast immer was Sie wollen.

Oft denken die Leute, dass sie wollen -type f, aber wirklich wollen sie -xtype f.

Detaillierte Ausgabe erhalten

findDie Standardaktion von ist, wenn Sie keine angeben -print. Alle oben angegebenen Befehle entsprechen sich selbst und werden -printam Ende angeheftet.

findwird häufig verwendet, um Befehle basierend auf den gefundenen Dateien auszuführen - häufig Befehle, die Änderungen vornehmen. Daneben gibt es aber auch andere Aktionen, deren Zweck es ist, Ergebnisse anzuzeigen -print. Von besonderem Interesse ist -ls:

find /path/to/folder -name '*bat*' -ls

Auf diese Weise erhalten Sie detaillierte Informationen zu jeder Datei in einem mehrspaltigen Format, ähnlich dem, was Sie beim Ausführen sehen würden (obwohl dies nicht ganz dasselbe ist) .ls file

Weitere Lektüre

Weitere Informationen findund andere Möglichkeiten zum Suchen von Dateien finden Sie unter:


1
Tolle Antwort, besonders der -xtypeRatschlag; vielleicht ls *bat*und -maxdepth/ mindepthsind auch erwähnenswert.
mklement0

2
@ mklement0 Danke! Das OP hat noch keine Klärung darüber geliefert, wo sich die Dateien befinden und ob eine Rekursion erforderlich ist. Als Antwort des Chaos bedeckt lsbereits, konzentrierte ich mich auf dem rekursive Fall mit findhier. Natürlich wäre auch eine ausführliche Antwort nützlich , die eine nicht (oder weniger) rekursive Auflistung von Dateinamen abdeckt, die mit einem Muster ( lsund findmit -maxdepth) übereinstimmen . Vielleicht möchten Sie eine solche Antwort posten!
Eliah Kagan,

16

Der einfachste Weg ist zu rennen

locate bat

Auf diese Weise können Sie den gesamten Computer nach Dateien durchsuchen, deren Dateiname "bat" enthält

Um die Liste der Dateien auf Ihrem PC zu aktualisieren, führen Sie

updatedb

Führen Sie diesen Befehl aus, wenn Sie Ihrem Konto kürzlich neue Dateien hinzugefügt haben


1
Bedürfnisseupdatetdb
Sergiy Kolodyazhnyy

4
@Serg Um neue Dateien zu finden (neuer als das letzte Mal, updatedbdas manuell oder automatisch ausgeführt wurde), sudo updatedbmüsste zuerst ausgeführt werden, ja.
Eliah Kagan

Beachten Sie, dass das gesamte System nach übereinstimmenden Namen durchsucht wird bat.
terdon

1
@terdon Ich habe dies bereits in der Antwort angegeben, glaube aber nicht, dass es die Abwahl verdient hat, als ich dies bereits angegeben habe.
Mark Kirby

1
Beachten Sie, dass dies VIEL schneller ist als find /das locateDurchsuchen einer Datenbank, während die Regex findrekursiv aufgelistet /und dann abgeglichen wird.
Timothy Gu

14

Öffnen Sie das Terminal und wechseln Sie in das Verzeichnis, in dem Sie suchen möchten. Führen Sie dann den folgenden Befehl aus:

find . -name "*bat*" -type f 

Das .startet den Suchbefehl aus dem aktuellen Verzeichnis.
Das -namestimmt mit der Zeichenfolge überein batund unterscheidet zwischen Groß- und Kleinschreibung. ( -inameIst Groß- und Kleinschreibung)
Die -type fSuche nach Dateien.


löschen und wiederherstellen? ok +1: P;)
AB

6

Wenn sich die Dateien im aktuellen Verzeichnis befinden, verwenden Sie:

$ ls *bat*
batgirl.c  batman.c  batwoman.c  cricketbat.c

Oder (um sie Zeile für Zeile zu haben):

$ ls -1 *bat*
batgirl.c
batman.c
batwoman.c
cricketbat.c

Wenn Sie das System nach diesen Dateien durchsuchen möchten, verwenden Sie:

$ find / -name "*bat*"
/path/to/cricketbat.c
/path/to/batgirl.c
/path/to/batwoman.c
/path/to/batman.c

1
Wenn Ihre Suche mit dem Stammverzeichnis beginnt, möchten Sie möglicherweise sudo hinzufügen, da dieser Befehl für einige Ordner die Meldung "Berechtigung verweigert"
ausgibt

4

Sie möchten den findBefehl mit der -inameOption für den Abgleich von Dateinamen verwenden , bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird, oder mit der Option für den Abgleich von Dateinamen , bei dem die Groß- und Kleinschreibung beachtet wird -name. In beiden Fällen können Sie Platzhalter verwenden. Um alle Dateinamen zu finden, die "bat" enthalten, verwenden Sie:

find / -iname '*bat*'

Oder

find / -name '*bat*'

Das *bedeutet "ein beliebiges Zeichen", daher wird bei der Suche nach einem batbeliebigen Zeichen gesucht , auch nach keinem, davor oder danach. Die /Suchvorgänge aus dem Stammverzeichnis können .rekursiv ausgeführt werden. Dabei wird entweder rekursiv aus dem aktuellen Verzeichnis oder dem absoluten Pfad gesucht, von dem aus gesucht werden soll. Schauen Sie sich an, wie Sie mit Regex in Linux-Shell-Skripten nach Dateien suchen


@EliahKagan danke, ich habe meiner Antwort einige weitere Informationen hinzugefügt.
AJefferiss

+1 Danke für die Bearbeitung. IMO ist es eine Stärke dieser Antwort, dass es vermieden wird , die wahllose Verwendung von zu empfehlen -type f, was mehr als nur das Ausschließen von Verzeichnissen bedeutet und oft nicht das ist , was Benutzer wirklich wollen .
Eliah Kagan

2

Benutz das gute alte find.

find <path_for_search> -type f -iname "*bat*" 

z.B.:

% find . -type f -iname "*bat*" 
./batgirl.c
./batwoman.c
./cricketbat.c
./batman.c

von man find:

-type c
          File is of type c:
          [..]
          d      directory
          [..]
          f      regular file
          [..]

-iname pattern 
          Like -name, but the match is case insensitive.
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.