polecenie, aby znaleźć pliki, wyszukując tylko część ich nazw?

32

Powiedzmy, że istnieją pliki o nazwach:

batman.c
debate.c
cricketbat.c

Jakiego polecenia i jak go użyć, aby wyświetlić listę wszystkich tych plików za pomocą tagu wyszukiwania bat?

srk_cb
źródło
5
Czy chcesz wyświetlić listę pasujących plików tylko w bieżącym katalogu? w dowolnym katalogu w bieżącym katalogu lub poniżej? gdziekolwiek w systemie?
steeldriver

Odpowiedzi:

47

Znajdowanie plików w batdowolnym miejscu

Aby znaleźć wszystkie pliki w dowolnym miejscu, /path/to/folderktórych nazwy zawierają bat, możesz użyć:

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

Mam cytowany wzór wyszukiwarki *bat*, ponieważ jeśli cytaty zostały pominięte, a pliki są *bat*w bieżącym katalogu, powłoka wzrośnie *bat*do listy nich i przekazać , że do find. Wtedy findnie działałoby dobrze. ( \*bat\*a "*bat*"także praca.)

Aby wyszukać w folderze, w którym aktualnie się znajdujesz (np. W którym cdedytujesz), użyj ., jak zwykle:

find . -name '*bat*'

Aby przeszukać cały komputer, użyj/ . Aby przeszukać katalog domowy, użyj ~lub pełną nazwę swojego katalogu domowego. ( Powłoka rozwija się~ do pełnej ścieżki katalogu domowego).

Poszerzanie lub zawężenie wyszukiwania według nazwy

Jeśli chcesz wyszukiwać bez rozróżniania wielkości liter, aby dopasować pliki zawierające BAT, bAtitd., Użyj -inametestu zamiast -nametestu:

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

Zauważyłem, że wszystkie twoje pliki kończą się .c. Jeśli chcesz tylko znaleźć takie pliki, użyj:

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

Zauważyłem, że wszystkie twoje nazwy plików mają batalbo na samym początku, albo na końcu części poprzedzającej .cprzyrostek. Jeśli chcesz uniknąć pasujących plików embattled.c, możesz użyć:

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

-ojest operatorem lub .

Pasujące tylko pliki

Aby znaleźć tylko zwykłe pliki - a nie foldery, dowiązania symboliczne i specjalne węzły urządzeń - możesz użyć -type f. Jest to często zalecane i czasami całkiem odpowiednie ... ale często nie to, czego naprawdę chcesz , szczególnie jeśli biegasz findw celu samodzielnego sprawdzenia wyników. Gdybyś miał link symboliczny pasujący do twojego wyszukiwania, czy nie chciałbyś o tym wiedzieć?

Jeśli chcesz znaleźć zarówno zwykłe pliki, jak i dowiązania symboliczne, możesz użyć:

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

To używa -ooperatora, a także nawiasów do grupowania (które muszą być cytowane, aby powłoka nie traktowała ich specjalnie; w przeciwnym razie pojawi się błąd składniowy).

Załóżmy jednak, że chcesz zobaczyć tylko dowiązania symboliczne, które ostatecznie wskazują na zwykły plik (a nie dowiązania symboliczne do katalogów, węzłów urządzeń itp.). To jest nawet jeszcze prostsze: użyj -xtypezamiast -type. Pod warunkiem, że nie korzystasz findz -Lflagi, -xtypew dowiązaniu symbolicznym testowany jest typ pliku, do którego prowadzi łącze.

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

Jeśli masz dowiązanie symboliczne do innego dowiązania symbolicznego do pliku, -xtype fdopasuje je, mimo że jego bezpośrednim celem jest inne dowiązanie symboliczne, a nie zwykły plik. To jest prawie zawsze to, czego chcesz.

Często ludzie myślą, że chcą -type f, ale tak naprawdę chcą -xtype f.

Uzyskiwanie szczegółowych danych wyjściowych

finddomyślną akcją, jeśli jej nie określisz, jest -print. Wszystkie podane powyżej polecenia są sobie równoważne z -printtackami na końcu.

findjest często używany do uruchamiania poleceń na podstawie znalezionych plików - często poleceń, które wprowadzają zmiany. Ale są też inne działania, których celem jest wyświetlanie wyników -print. Szczególnie interesujące jest -ls:

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

Daje to szczegółowe informacje o każdym pliku, w formacie wielokolumnowym, podobnym do (choć nie do końca takiego samego), jak to, co zobaczysz po uruchomieniu .ls file

Dalsza lektura

Aby uzyskać więcej informacji o findinnych sposobach wyszukiwania plików, zobacz:

Eliah Kagan
źródło
1
Świetna odpowiedź, szczególnie -xtyperada; być może ls *bat*i -maxdepth/ mindepthsą również warte wspomnienia.
mklement0
2
@ mklement0 Thanks! OP nie wyjaśnił jeszcze, gdzie są pliki i czy potrzebna jest rekurencja. Jako odpowiedź Chaos pokryte lsjuż, że koncentruje się na rekurencyjnym przypadku z findtutaj. Oczywiście przydatna byłaby również szczegółowa odpowiedź obejmująca brak (lub mniej) rekurencyjną listę nazw plików pasujących do jakiegoś wzorca ( lsi za findpomocą -maxdepth). Możesz opublikować taką odpowiedź!
Eliah Kagan
16

Najłatwiej jest uruchomić

locate bat

W ten sposób możesz przeszukiwać cały komputer w poszukiwaniu plików zawierających „bat” w nazwie pliku

Aby odświeżyć listę plików na komputerze, uruchom

updatedb

Uruchom to polecenie, gdy ostatnio dodałeś nowe pliki do swojego konta

Mark Kirby
źródło
1
potrzebyupdatetdb
Sergiy Kolodyazhnyy
4
@Serg Aby znaleźć nowe pliki (nowsze niż ostatni raz updatedbbył uruchamiany ręcznie lub automatycznie), sudo updatedbnajpierw trzeba je uruchomić, tak.
Eliah Kagan
Pamiętaj, że przeszuka to cały system w poszukiwaniu pasujących nazw bat.
terdon
1
@terdon Już to stwierdziłem w odpowiedzi, nie sądzę, że zasługiwało na głosowanie, kiedy już to powiedziałem.
Mark Kirby
1
Zauważ, że jest to DUŻO szybciej niż find /podczas locatewyszukiwania w bazie danych, podczas gdy findrekurencyjnie wyświetla listę, /a następnie dopasowuje wyrażenie regularne.
Timothy Gu
14

Otwórz terminal i zmień katalogi na katalog, z którego chcesz rozpocząć wyszukiwanie, a następnie uruchom następującą komendę:

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

.Uruchamia polecenie Znajdź z bieżącego katalogu. Dopasowuje ciąg i jest wielkość liter. ( Nie uwzględnia wielkości liter) Do wyszukiwania tylko dla plików.
-namebat-iname
-type f

Karel
źródło
usunąć i cofnąć? ok +1: P;)
AB
6

Jeśli pliki znajdują się w bieżącym katalogu, użyj:

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

Lub (aby mieć je wiersz po wierszu):

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

Jeśli chcesz przeszukać system w poszukiwaniu tych plików, użyj:

$ find / -name "*bat*"
/path/to/cricketbat.c
/path/to/batgirl.c
/path/to/batwoman.c
/path/to/batman.c
chaos
źródło
1
Jeśli wyszukiwanie rozpoczyna się od katalogu głównego, możesz dodać sudo, ponieważ to polecenie zgłosi „Odmowa zezwolenia” dla niektórych folderów
Sergiy Kolodyazhnyy
4

Chcesz użyć findpolecenia z -inameopcją dopasowania nazwy pliku bez rozróżniania wielkości liter lub -nameopcją dopasowania nazwy pliku z rozróżnianiem wielkości liter . Oba pozwalają na użycie nazw symboli wieloznacznych. Aby znaleźć dowolne nazwy plików zawierające „nietoperz”, należy użyć:

find / -iname '*bat*'

Lub

find / -name '*bat*'

W *oznacza „dowolny znak (s)”, więc poszukiwanie poszukuje batwszelkich znaków, w tym żaden, przed lub po nim. Do /wyszukiwania z katalogu rekursywnie, można użyć .która będzie wyszukiwać rekursywnie z bieżącego katalogu lub bezwzględną ścieżkę gdzie chcesz szukać od. Zobacz, jak szukać plików przy użyciu wyrażenia regularnego w skrypcie powłoki Linux

AJefferiss
źródło
@EliahKagan dzięki, dodałem więcej informacji do mojej odpowiedzi.
AJefferiss
+1 dzięki za edycję. IMO jest mocną stroną tej odpowiedzi, że unika zalecania masowego korzystania z niej -type f, co nie tylko wyklucza katalogi i często nie jest tym, czego użytkownicy naprawdę chcą .
Eliah Kagan
2

Użyj starego dobrego find.

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

na przykład.:

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

z man find:

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

-iname pattern 
          Like -name, but the match is case insensitive.
AB
źródło