Wie kann ich eine Datei nach Name und Teilpfad durchsuchen?

64

Oft habe ich einen Dateinamen und einen Teilpfad, zB "content / docs / file.xml".

Gibt es eine einfache Möglichkeit, nach dieser Datei zu suchen, ohne ihren Namen manuell in Teile zu schneiden, um den Verzeichnisnamen und den Dateinamen getrennt anzugeben?

Es wäre großartig, wenn ich so arbeiten würde find, damit ich rennen könnte find content/docs/file.xml, aber leider nicht.

slhck
quelle
1
Sie können versuchen, am Anfang einen Platzhalter * hinzuzufügen. find -path *content/docs/file.xmlarbeitete für mich.
Bob
Danke, @Bob, es hat wirklich für mich funktioniert. Übrigens, interessanterweise funktioniert es nicht, wenn ich nach einem Sternchen einen Schrägstrich hinzufüge: "find -path * / content / docs / file.xml". Trotzdem vielen Dank.
@ Bob, bitte mache es als Antwort und ich werde es als richtig markieren.
Der Grund, warum der Schrägstrich nach dem Sternchen nicht funktioniert hat, ist wahrscheinlich, dass das Sternchen hätte ausgeblendet werden müssen. Weitere Informationen finden Sie in der Bearbeitung zu meiner Antwort.
Bob

Antworten:

72

Übergeben Sie einen *Platzhalter, um eine Übereinstimmung für etwas anzuzeigen . Sie müssen auch dem *s entkommen , zB:

find . -path \*content/docs/file.xml

oder füge das Muster in Anführungszeichen ein, zB:

find . -path "*content/docs/file.xml"

Wie die Manpage es beschreibt:

$ find. -name * .c -print

find: Pfade müssen vor dem Ausdruck stehen

Dies geschieht, weil * .c durch die Shell erweitert wurde und find eine Befehlszeile wie die folgende erhält:

finden . -name bigram.c code.c frcode.c locate.c -print

Dieser Befehl wird natürlich nicht funktionieren. Statt wie folgt vorzugehen, sollten Sie das Muster in Anführungszeichen setzen oder den Platzhalter umgehen:

$ find. -name \ *. c -print

Bob
quelle
10

find hat auch die Option -wholename find $top_dir -wholename *string*

find /usr -wholename *in/abiw*

>/usr/bin/abiword
Technosaurus
quelle
Ich kenne den vollständigen Pfad nicht, nur teilweise, so dass "-wholename" nicht funktioniert.
Die Flagge ist irreführend, siehe mein Beispiel ... Sie können die Zeichenfolge nur in ein Verzeichnis erweitern, wenn Sie es kennen
Technosaurus
3
find . -type f | grep "content/docs/file.xml"

oder nur

locate content/docs/file.xml
Nifle
quelle
locate ist eine interessante Option, durchsucht aber den gesamten Datenträger. Ich möchte die Möglichkeit haben, das Basissuchverzeichnis anzugeben oder zumindest mit param anzugeben, dass die Suche von diesem Verzeichnis aus erfolgen soll (wie bei Ihrer ersten Option). , nicht von der Wurzel.
1
@ user69817 - locate durchsucht die Festplatte nicht, sondern fragt eine locate-Datenbank ab, die normalerweise einmal täglich über cron gefüllt wird.
Tink
1

Suchen Sie beispielsweise Dateien an einem Speicherort mit Sternchen / Platzhalter ( *) als: dir=“/apps/*/instance01/" Sie könnten find verwenden ${dir} -name “*.jks”. Platzieren Sie alle Dateien in einem Array wie folgt:

arr=(`find ${dir} -name “*.jks"`)

Wenn Sie Dateien mit anderen Erweiterungen erhalten möchten, verwenden Sie 'oder' wie folgt:

-name "*.keystore" -o -name "*.jks" -o -name “*.p12" da -namenur einzelne Zeichenfolgen akzeptiert werden, verwenden Sie 'oder'.

Zum Schluss ordnen Sie alles wie folgt an:

arr=(`find ${dir} -name "*.keystore" -o -name "*.jks" -o -name "*.p12"`)

Wenn Sie vollständige Pfade haben, die nicht Teilpfade sind, ist es viel einfacher, sie in Arrays wie folgt zu platzieren:

arr=(“/Users/ajay/Documents/keystore_and_p12files/"*.{keystore,p12,jks})
user450631
quelle