Znajdź pliki i katalogi w Linuksie za pomocą polecenia find | Opensource.com
niezależnie od tego, jak zorganizowałem się, wydaje się, że zawsze są chwile, kiedy po prostu nie mogę zlokalizować pliku. Czasami to dlatego, że nie pamiętam nazwy pliku w pierwszej kolejności. Innym razem znam to imię, ale nie pamiętam, gdzie postanowiłem je zachować. Są nawet chwile, kiedy potrzebuję pliku, którego nie utworzyłem w pierwszej kolejności. Bez względu na rozterkę, wiem jednak, że w systemie POSIX zawsze mam polecenie find
.
instalacja znajdź
polecenie find
jest zdefiniowane przez specyfikację POSIX, która tworzy otwarty standard, za pomocą którego mierzone są systemy POSIX (w tym Linux, BSD i macOS). Mówiąc najprościej, masz już find
zainstalowany tak długo, jak używasz Linuksa, BSD lub macOS.
jednak nie wszystkie polecenia find
są dokładnie takie same. Na przykład polecenie GNU find
ma cechy, których polecenie BSD, Busybox lub Solaris find
może nie mieć Lub Ma, ale implementuje inaczej. Ten artykuł używa GNU find
z pakietu findutils, ponieważ jest łatwo dostępny i dość popularny. Większość poleceń przedstawionych w tym artykule działa z innymi implementacjami find
, ale jeśli wypróbujesz polecenie na platformie innej niż Linux i uzyskasz nieoczekiwane rezultaty, spróbuj pobrać i zainstalować wersję GNU.
Znajdź plik po nazwie
możesz zlokalizować plik po jego nazwie, podając pełną nazwę pliku lub jego części za pomocą wyrażeń regularnych. Polecenie find
wymaga ścieżki do katalogu, w którym chcesz wyszukiwać, opcji określających szukany atrybut (na przykład –name
dla nazwy pliku uwzględniającej wielkość liter), a następnie szukanego ciągu. Domyślnie szukany ciąg jest traktowany dosłownie: polecenie find
wyszukuje nazwę pliku, która jest dokładnie tym samym ciągiem, który wpisujesz między cudzysłowami, chyba że używasz składni wyrażenia regularnego.
Załóżmy, że twój katalog dokumentów zawiera cztery pliki: Foo
, foo
, foobar.txt
, i foo.xml
Oto dosłowne wyszukiwanie pliku o nazwie “foo”:
$ find ~ -name "foo"
/home/tux/Documents/examples/foo
możesz Rozszerzyć wyszukiwanie, nie rozróżniając wielkości liter za pomocą opcji -iname
:
$ find ~ -iname "foo"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
symbole wieloznaczne
możesz użyć podstawowych znaków wieloznacznych powłoki, aby rozszerzyć wyszukiwanie. Na przykład gwiazdka (*
) reprezentuje dowolną liczbę znaków:
$ find ~ -iname "foo*"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt
znak zapytania (?
) reprezentuje pojedynczy znak:
$ find ~ -iname "foo*.???"
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt
nie jest to składnia wyrażeń regularnych, więc kropka (.
) reprezentuje literalną kropkę w tym przykładzie.
wyrażenia regularne
możesz również używać wyrażeń regularnych. Podobnie jak w przypadku -iname
i -name
, istnieje opcja uwzględniająca wielkość liter i niewrażliwa na wielkość liter. W przeciwieństwie do opcji -name
i -iname
, wyszukiwanie -regex
i -iregex
jest stosowane do całej ścieżki, a nie tylko do nazwy pliku. Oznacza to, że jeśli szukasz foo
, nie otrzymasz wyników, ponieważ foo
nie pasuje do /home/tux/Documents/foo
. Zamiast tego musisz albo wyszukać całą ścieżkę, albo użyć sekwencji wieloznacznej na początku łańcucha:
$ find ~ -iregex ".*foo"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
Znajdź plik zmodyfikowany w ciągu ostatniego tygodnia
aby znaleźć plik ostatnio zmodyfikowany w zeszłym tygodniu, użyj opcji -mtime
wraz z (ujemną) liczbą dni w przeszłości:
$ find ~ -mtime -7
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt
Znajdź plik zmodyfikowany w zakresie dni
możesz połączyć opcje -mtime
, aby znaleźć plik w zakresie dni. Dla pierwszego argumentu -mtime
podaj najnowszą liczbę dni, które mogłeś zmodyfikować w pliku, a dla drugiego podaj największą liczbę dni. Na przykład, to wyszukiwanie wyszukuje pliki z modyfikacjami razy więcej niż jeden dzień w przeszłości, ale nie więcej niż siedem:
$ find ~ -mtime +1 -mtime -7
Ogranicz wyszukiwanie według typu pliku
często optymalizuje się wyniki find
, określając typ pliku, którego szukasz. Nie powinieneś używać tej opcji, jeśli nie jesteś pewien, czego szukasz, ale jeśli wiesz, że szukasz Pliku, a nie katalogu, lub katalogu, ale nie pliku, to może to być świetny filtr do użycia. Opcja jest -type
, a jej argumenty są kodem literowym reprezentującym kilka różnych rodzajów danych. Najczęstsze to:
-
d
– katalog -
f
– plik -
l
– dowiązanie symboliczne -
s
– Gniazdo -
p
– nazwana rura (używana dla FIFO) -
b
– Block special (Zwykle oznaczenie dysku twardego)
oto kilka przykładów:
$ find ~ -type d -name "Doc*"
/home/tux/Documents
$ find ~ -type f -name "Doc*"
/home/tux/Downloads/10th-Doctor.gif
$ find /dev -type b -name "sda*"
/dev/sda
/dev/sda1
Dostosuj zakres
polecenie find
jest domyślnie rekurencyjne, co oznacza, że wyszukuje wyniki w katalogach katalogów zawartych w katalogach (i tak dalej). Może to być przytłaczające w dużym systemie plików, ale możesz użyć opcji -maxdepth
, aby kontrolować, jak głęboko w strukturę folderów chcesz zejść find
:
$ find /usr -iname "*xml" | wc -l
15588
$ find /usr -maxdepth 2 -iname "*xml" | wc -l
15
możesz na przemian ustawić minimalną głębokość rekurencji za pomocą -mindepth
:
$ find /usr -mindepth 8 -iname "*xml" | wc -l
9255
Pobierz ściągawkę
ten artykuł obejmuje tylko podstawowe funkcje find
. Jest to świetne narzędzie do przeszukiwania systemu, ale jest również bardzo użytecznym interfejsem dla potężnego polecenia równoległego. Istnieje wiele powodów, aby dowiedzieć się find
, więc pobierz naszą bezpłatną ściągawkę find
, aby pomóc ci dowiedzieć się więcej o poleceniu.
Leave a Reply