Jak mogę wyszukać plik według jego nazwy i częściowej ścieżki?

61

Często mam nazwę pliku i jego częściową ścieżkę, np. „Content / docs / file.xml”.

Czy istnieje prosty sposób wyszukiwania tego pliku bez ręcznego dzielenia jego części na osobne nazwy katalogu i nazwy pliku?

Byłoby wspaniale, gdyby finddziałał w ten sposób, więc mogłem biec find content/docs/file.xml, ale niestety tak nie jest.

slhck
źródło
1
Możesz spróbować dodać * symbol wieloznaczny na początku. find -path *content/docs/file.xmlpracował dla mnie.
Bob
dzięki, @Bob, to naprawdę dla mnie zadziałało. Btw, ciekawe, że jeśli dodam ukośnik za gwiazdką: „find -path * / content / docs / file.xml”, to nie działa. W każdym razie bardzo dziękuję.
również @Bob, proszę udzielić odpowiedzi, a ja oznaczę ją jako poprawną.
Powodem, dla którego ukośnik po gwiazdce nie zadziałał, jest prawdopodobnie to, że gwiazdka powinna być ucieczką, zobacz edycję mojej odpowiedzi.
Bob

Odpowiedzi:

70

Podaj *symbol wieloznaczny, aby wskazać dopasowanie do czegokolwiek . Musisz także uciec od *s, np .:

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

lub umieść wzór w cudzysłowie, np .:

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

Jak opisuje to strona podręcznika:

$ znajdź. -nazwa * .c -print

find: ścieżki muszą poprzedzać wyrażenie

Dzieje się tak, ponieważ * .c został rozszerzony przez powłokę, co powoduje, że find faktycznie otrzymuje wiersz poleceń taki jak ten:

odnaleźć . -nazwa bigram.c kod.c frcode.c zlokalizuj.c -print

To polecenie oczywiście nie zadziała. Zamiast robić to w ten sposób, powinieneś zawrzeć wzór w cudzysłowie lub uniknąć znaku wieloznacznego:

$ znajdź. -nazwa \ *. c -print

Kok
źródło
10

find ma również opcję -wholename find $top_dir -wholename *string*

find /usr -wholename *in/abiw*

>/usr/bin/abiword
technozaur
źródło
Nie znam pełnej ścieżki, tylko częściową, więc „-wholename” nie zadziała.
flaga wprowadza w błąd, patrz mój przykład ... pozwala tylko rozszerzyć ciąg do katalogu, jeśli go znasz
technosaurus
3
find . -type f | grep "content/docs/file.xml"

Lub tylko

locate content/docs/file.xml
Nifle
źródło
locate jest interesującą opcją, ale przeszukuje cały dysk, chciałbym mieć możliwość określenia podstawowego katalogu wyszukiwania lub przynajmniej określenia za pomocą param, że wyszukiwania należy dokonać z tego katalogu (tak jak robi to Twoja pierwsza opcja) , nie z katalogu głównego.
1
@ user69817 - wręcz przeciwnie, locate nie przeszukuje dysku, przesłuchuje zlokalizowaną bazę danych, która zwykle zapełniana jest przez crona raz dziennie.
Tink
1

Na przykład wyszukiwanie plików w lokalizacji za pomocą gwiazdki / wildcard ( *) jako: dir=“/apps/*/instance01/" możesz użyć find ${dir} -name “*.jks”. umieszczenie wszystkich plików w tablicy takiej jak ta:

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

jeśli chcesz uzyskać pliki z innymi rozszerzeniami użyj „lub” w ten sposób:

-name "*.keystore" -o -name "*.jks" -o -name “*.p12" ponieważ -nameakceptuje tylko pojedynczy ciąg, więc użyj „lub”.

Na koniec umieść wszystko w tablicy w następujący sposób:

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

jeśli masz pełne ścieżki, a nie ścieżki częściowe, o wiele łatwiej jest umieścić je w tablicach w ten sposób:

arr=(“/Users/ajay/Documents/keystore_and_p12files/"*.{keystore,p12,jks})
użytkownik450631
źródło