Jak mogę rekurencyjnie znajdować wszystkie pliki w bieżącym i podfolderach na podstawie dopasowania symboli wieloznacznych?

1886

Jak mogę rekurencyjnie znajdować wszystkie pliki w bieżącym i podfolderach na podstawie dopasowania symboli wieloznacznych?

Jan
źródło

Odpowiedzi:

2738

Użyj do tego celu find :

find . -name "foo*"

findpotrzebuje punktu początkowego, a .kropka wskazuje bieżący katalog.

tux21b
źródło
21
Wiem, że jest to oznaczone jako linux, ale warto o tym wspomnieć: ścieżka jest wymagana dla innych wariantów * nix, które nie są linuksem. W systemie Linux ścieżka jest opcjonalna, jeśli chcesz użyć kropki.
IslandCow
4
@Seatter „foo *” mówi find, aby szukał wszystkich plików zaczynających się od „foo”. To tylko jego przykład. Możesz użyć „gpio *”, aby znaleźć wszystkie pliki, których nazwy zaczynają się od gpio, lub po prostu „gpio1”, aby znaleźć wszystkie pliki o nazwie gpio1.
schumacher574
29
zauważ, że „foo *” jest w cudzysłowie, więc powłoka nie rozwija go przed przekazaniem go do znalezienia. jeśli właśnie to zrobiłeś find . foo*, to foo*byłoby rozwinięte, a następnie przekazane do znalezienia.
uśmiechnij się
32
Warto podkreślić, że " "jest to bardzo potrzebne do wyszukiwania rekurencyjnego.
WesternGun
3
Przydatne również: jeśli nie chcesz otrzymywać powiadomień o katalogach, do których nie masz uprawnień (lub innych błędach), możesz to zrobićfind . -name "foo*" 2>/dev/null
Jobbo
221

Pipowanie w grep jest często wygodniejsze; daje pełną moc wyrażeń regularnych do dowolnego dopasowywania symboli wieloznacznych.

Na przykład, aby znaleźć wszystkie pliki z ciągiem znaków „foo” bez rozróżniania wielkości liter:

~$ find . -print | grep -i foo
Paul Whipp
źródło
56
findzawiera również -iname, -regexi -iregexflagi dla wielkości liter maska, regex i wielkości liter regex dopasowywania tak rurociągu, aby grepnie jest konieczne.
iobender
7
Nie sądzę, żeby chodziło o bycie niepotrzebnym, ale o wygodę.
Elijah Lynn
1
Jednak potokowanie do grep -v może umożliwiać użycie prostych ciągów lub wyrażeń regularnych do usunięcia niepotrzebnych wpisów.
door_number_three
3
@iobender - Niestety z doświadczenia mogę powiedzieć, że nie wszystkie systemy są wyposażone w findpolecenia obsługujące te opcje. Czasami grepstaje się jedyną opcją.
Pan Llama,
150

find znajdzie wszystkie pliki pasujące do wzorca:

find . -name "*foo"

Jeśli jednak chcesz zdjęcie:

tree -P "*foo"

Mam nadzieję że to pomoże!

IslandCow
źródło
18
brew install treedla użytkowników Mac OSX bez apt-getzainstalowanego oprogramowania
DeBraid
1
Testowany na macOS Sierra, po prostu dodaj „--print” -> „find. nazwa „* foo” --print ”. superuser.com/questions/177289/searching-mac-through-terminal
john-salib
2
sudo mniam zainstalować drzewo -y dla CentOS
Santosh Kumar Arjunan
39
find -L . -name "foo*"

W kilku przypadkach potrzebowałem parametru -L do obsługi dowiązań katalogu symbolicznego. Domyślnie dowiązania symboliczne są ignorowane. W takich przypadkach było to dość mylące, ponieważ zmieniałem katalog na podkatalog i widziałem plik pasujący do wzorca, ale find nie zwrócił nazwy pliku. Użycie -L rozwiązuje ten problem. Opcje dowiązania symbolicznego dla find to -P -L -H

toddcscar
źródło
1
Przełącznik L jest bardzo pomocny. Wiele razy użytkownik nie ma pojęcia o bazowych katalogach, niezależnie od tego, czy są one linkami miękkimi, czy zwykłymi katalogami. W razie wątpliwości zawsze warto skorzystać z opcji L. Przynajmniej zawsze mi pomogło.
Ritesz
2
To była dla mnie odpowiedź. Dzięki!
iedmrc
33

Jeśli twoja powłoka obsługuje nową opcję globowania (można ją włączyć przez :)shopt -s globstar , możesz użyć:

echo **/*foo*

znaleźć rekursywnie dowolne pliki lub foldery. Jest to obsługiwane przez powłoki Bash 4, zsh i podobne.


Osobiście mam zdefiniowaną tę funkcję powłoki:

f() { find . -name "*$1*"; }

Uwaga: powyższą linię można wkleić bezpośrednio do powłoki lub dodać do ~/.bashrcpliku użytkownika .

Następnie mogę wyszukać dowolne pliki, wpisując:

f some_name

Alternatywnie możesz użyć fdnarzędzia o prostej składni, np fd pattern.

kenorb
źródło
1
To po prostu idzie na jeden poziom. Nie wracam do podkatalogów dla mnie
Broncha
3
@Broncha Ponieważ musisz aktywować rozszerzone globowanie za pomocą shopt -s globstarpolecenia. Jest to obsługiwane w powłokach Bash, Zsh i podobnych.
kenorb
bash-3.2$ shopt -s globstardajebash: shopt: globstar: invalid shell option name
narysowany
@drewish Musisz uaktualnić Bash do wersji 4.x
kenorb
echo * / * foo jest szybszy niż znajdowanie
Josef Klimuk
31

fd

W przypadku, gdy findjest zbyt wolny, wypróbuj fdnarzędzie - prostą i szybką alternatywę dla findnapisanych w Rust.

Składnia:

fd PATTERN

Próbny:

Strona domowa: https://github.com/sharkdp/fd

kenorb
źródło
17
Pierwszy raz widziałem gif na SO od prawie 9 lat. Dobra robota!
Joshua Pinter,
1
Te wyniki wydajności wyglądają bardzo obiecująco. Możesz rozważyć dodanie fd do domowego naparu ...
Gr3go,
poza tematem: jakiego narzędzia użyłeś do stworzenia pliku svg na wersję demonstracyjną?
aprodan
2
@aprodan Obraz demonstracyjny został skopiowany z GitHub, ale sądzę, że używają asciinema, a następnie przekonwertowano na format GIF, ale nie jestem pewien.
kenorb
1
W rzeczywistości jest to format SVG, więc prawdopodobnie asciicast2vectormożna go użyć.
kenorb
27
find <directory_path>  -type f -name "<wildcard-match>"

W dopasowaniu wieloznacznym możesz podać ciąg, który chcesz dopasować, np. * .C (dla wszystkich plików c)

XYZ_Linux
źródło
1
Twoja odpowiedź jest pierwszą najbardziej poprawną tutaj, ponieważ wyszukuje tylko pliki określone. Inne, nieokreślające typu, zwrócą katalogi.
wilsotc
jeśli chcesz wyszukać katalog „-type f” można zmienić na „-type d”
XYZ_Linux
11

Możesz użyć:

# find . -type f  -name 'text_for_search'

Jeśli chcesz użyć REGX użyj -iname

# find . -type f  -iname 'text_for_search'
użytkownik8848899
źródło
9

Następujące polecenie wyświetli listę wszystkich plików o dokładnej nazwie „wzorzec” (na przykład) w bieżącym i jego podfolderach.

find ./ -name "pattern"

anshul
źródło
8

Domyślny sposób wyszukiwania pliku rekurencyjnego i dostępny w większości przypadków to

find . -name "filepattern"

Rozpoczyna rekurencyjne przechodzenie do nazwy pliku lub wzorca z bieżącego katalogu, w którym się znajdujesz. Za pomocą polecenia find możesz używać symboli wieloznacznych i różnych przełączników, aby wyświetlić pełną listę opcji, wpisz

man find

lub jeśli strony podręcznika nie są dostępne w twoim systemie

find --help

Istnieją jednak bardziej nowoczesne i szybsze narzędzia niż znajdowanie, które przemierzają cały system plików i indeksują pliki, jednym z takich powszechnych narzędzi jest zlokalizowanie lub slocate / mlocate, powinieneś sprawdzić instrukcję swojego systemu operacyjnego, jak go zainstalować, a gdy już to zrobisz zainstalowany musi zainicjować bazę danych, jeśli skrypt instalacyjny tego nie zrobi, można to zrobić ręcznie, wpisując

sudo updatedb

I, aby użyć go do wyszukiwania określonego typu pliku

locate filename

Lub, aby wyszukać nazwę pliku lub tupot z bieżącego katalogu, możesz wpisać:

 pwd | xargs -n 1 -I {} locate "filepattern"

Przejrzy bazę danych plików i szybko wydrukuje nazwy ścieżek pasujące do wpisanego wzoru. Aby zobaczyć pełną listę opcji lokalizacji, wpisz: locate --helplubman locate

Dodatkowo możesz skonfigurować lokalizację, aby aktualizowała bazę danych w zaplanowanym czasie za pomocą zadania cron, więc przykładowy cron, który aktualizuje bazę danych o 1 w nocy, wygląda następująco:

0 1 * * * updatedb

Te zadania cron muszą być skonfigurowane przez użytkownika root, ponieważ updatedb potrzebuje uprawnień roota do przechodzenia przez cały system plików.

Aleksandar Pavić
źródło
7

do wyszukiwania plików
find / -xdev -name settings.xml -> cały komputer
find ./ -xdev -name settings.xml -> bieżący katalog i jego podkatalog

dla plików z rozszerzeniem

find . -type f -name "*.iso"
Alberto
źródło
6

Jestem zaskoczony, widząc, że lokalizowanie nie jest często używane, gdy mamy iść rekurencyjnie.

Najpierw zlokalizuję „$ PWD”, aby uzyskać listę plików w bieżącym folderze, a następnie uruchomię na nich greps, jak mi się podoba.

locate "$PWD" | grep -P <pattern>

Oczywiście przy założeniu, że aktualizacja jest wykonywana, a indeks jest okresowo aktualizowany. Jest to znacznie szybszy sposób na znalezienie plików niż uruchomienie znalezienia i poproszenie go o zejście z drzewa. Wspominając o tym dla kompletności. Nie ma nic przeciwko użyciu find, jeśli drzewo nie jest bardzo ciężkie.

melchi
źródło
locate "$PWD*.mp4" Wystarczy przypomnieć, że możesz być w stanie pominąćgrep
Jefferey Cave
5

Poniższe polecenie pomaga wyszukać dowolne pliki

1) Bez względu na wielkość liter
2) Wynik Bez folderów bez pozwolenia
3) Wyszukiwanie z katalogu głównego lub ze ścieżki, którą lubisz. Zmień / z preferowaną ścieżką.

Składnia:
find -iname 2> & 1 | grep -v „Odmowa zezwolenia”

Przykład

znajdź / -iname „C * .xml” 2> i 1 | grep -v „Odmowa zezwolenia”

find / -iname '*C*.xml'   2>&1 | grep -v "Permission denied"
MukeshKoshyM
źródło
1
dlaczego do cholery używasz do tego grep? Wystarczy przekierować stderr na nullfind / -iname '*C*.xml' 2>/dev/null
phuclv
3

Jeśli chcesz wyszukać specjalny plik ze znakiem wieloznacznym, możesz użyć następującego kodu:

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

Załóżmy, że chcesz przeszukać wszystkie pliki .conf stąd:

.oznacza, że ​​wyszukiwanie rozpoczęło się od tego miejsca (bieżące miejsce)
-typeoznacza typ elementu wyszukiwania, którym jest plik (f).
-nameoznacza, że ​​chcesz wyszukiwać pliki o nazwach * .conf .

Reza Harasani
źródło
3

Spowoduje to przeszukanie wszystkich powiązanych plików w bieżących i podkatalogach, obliczając ich liczbę osobno, a także całkowicie:

find . -name "*.wanted" | xargs wc -l
Jay Yang
źródło
2

Posługiwać się

find path/to/dir -name "*.ext1" -o -name "*.ext2"

Wyjaśnienie

  1. Pierwszy parametr to katalog, który chcesz przeszukać.
  2. Domyślnie findrekursja.
  3. -oOznacza -or. Powyżej oznacza poszukiwanie tego symbolu wieloznacznego LUB tego. Jeśli masz tylko jeden wzór, nie ma takiej potrzeby -o.
  4. Cytaty wokół wzoru wieloznacznego są wymagane.
Shital Shah
źródło