10 przydatnych porad na korzystanie z GNU Find

Narzędzie GNU find to jedno z najbardziej przydatnych poleceń w systemie Linux, a służy oczywiście do znajdowania potrzebnych nam plików. Na pierwszy rzut oka jego opcje oraz składnia mogą wydawać się nam kosmiczne. Jednakże przy odrobinie praktyki będziesz w stanie znaleźć dowolny plik na swoim dysku bez praktycznie żadnych problemów. Aby pomóc ci w rozpoczęciu pracy z narzędziem, przygotowaliśmy dla ciebie 10 przydatnych porad – sposobów na znajdowanie plików.

Zwróć uwagę na to, że nie wszystkie wersje narzędzia find obsługuje się identycznie. Komenda dla systemu Linux jest trochę inna niż ta znajdująca się na systemach BSD, Solaris i Mac OS X. Większość składni jest jednak podobna i możesz jej spokojnie używać pomiędzy systemami, ale istnieją także pewne wyjątki, w które jednak nie będziemy się zagłębiać.

1. Znajdowanie plików na podstawie ich nazwy

Najpierw zacznijmy od podstaw. Jeśli pragniesz znaleźć plik, którego nazwę znasz, tylko nie pamiętasz, w jakim katalogu go zostawiłeś, to składnia find, jakiej musisz użyć, jest bardzo prosta. Po prostu przekaż do find, że szukasz określonej nazwy:
find -name plik

Zakładając, że plik istnieje, find pokaże jego lokalizację (oraz lokalizacje wszystkich innych plików posiadających dokładnie tą samą nazwę). Wygląda to tak:
szymon@szymon-desktop:~$ find -name plik
./Dokumenty/plik
./plik
szymon@szymon-desktop:~$

2. Znajdowanie plików poprzez podanie ich rozmiaru

Czasami warto skorzystać także z innych atrybutów plików w celu ich znalezienia np. znajdowanie plików dzięki znajomości ich rozmiaru. Weźmy prosty przykład: pracujesz na serwerze i zauważasz, że kończy się wolne miejsce na jednej z partycji. Których plików musisz się pozbyć, aby szybko i skutecznie uporać się z problemem? Aby uzyskać odpowiedź, wystarczy wrzucić do terminala polecenie find z odpowiednimi parametrami.
W tym przypadku musisz użyć opcji -size, po czym należy podać rozmiar pliku, jakiego szukasz. Możesz użyć dowolnej jednostki, od bloków (b) do gigabajtów (G). Aby znaleźć pliki o rozmiarze 100k, użyj komendy:
find -size 100k
Polecenie znajdzie pliki o rozmiarze dokładnie 100k. Jest to jednakże dosyć ograniczone działanie, dlatego jeśli chcesz znaleźć pliki większe lub mniejsze niż podana wielkość, to użyj znaku + lub – wraz z żądaną wielkością. Tak więc polecenie find -size +100k znajdzie pliki większe niż 100k, a find -size -100k odnajdzie pliki mniejsze.
Możesz również odszukać puste pliki korzystając z parametru -empty:
find -empty -type f
Dodatkowy tu parametr -type -f określa, ze chcemy znaleźć tylko pliki, a nie wszystkie katalogi, które find -empty również pokazywałoby jako pliki puste.

3. Znajdowanie plików poprzez przynależność do użytkownika

Kolejną pozytywną cechą find jest możliwość znajdowania plików należących do określonego użytkownika. Zacznijmy jednak od szukania plików osieroconych, które nie należą do nikogo. Takie pliki mogą pojawić się na dysku w przypadku przenoszenia ich między systemami, a także po usuwaniu użytkowników. Aby je znaleźć, należy użyć polecenia:
find -nouser
Aby znaleźć pliki, które już przynależą do określonego użytkownika, powinieneś użyć opcji -user lub -uid. Ta pierwsza umożliwia szukanie za pomocą nazwy użytkownika lub jego identyfikatora w systemie, a ta druga jedynie za pomocą identyfikatora. Jeśli więc chciałbym znaleźć w pewnym folderze wszystkie pliki należące do mnie, użyłbym jednego z trzech wariantów: find -user szymon, find -user 1000, find -uid 1000.
Gdybyś chciał znaleźć pliki, które należą albo do jednego albo do drugiego użytkownika, użyj parametru -o:
find -user root -o -user www-data
To pokaże wszystkie pliki, które należą do użytkownika root lub www-data. Możesz również znaleźć pliki, które NIE należą do wybranego użytkownika korzystając z parametru -not:
find -not -user www-data
Oczywiście podane operatory świetnie działają także z innymi wcześniej podanymi. Dla przykładu możesz znaleźć pliki określonego użytkownika, które są nie większe niż podana wielkość:
find -user www-data -not -size +100k

4. Znajdowanie plików poprzez przynależność do grupy

Możesz również szukać swoich plików poprzez podanie id lub nazwy grupy, do jakiej należą. W tym przypadku skorzystaj z parametru -group. Składnia ma tutaj postać find -group grupa.
Oczywiście możesz także tej opcji użyć z innymi operatorami np. w przypadku próby znalezienia plików należących do określonego użytkownika i jednocześnie do konkretnej grupy.

5. Znajdowanie plików na podstawie uprawnień

Może się również zdarzyć, że będziesz chciał przeskanować swój system plików na obecność plików przez wszystkich zapisywalnych bądź posiadających nieprawidłowe uprawnienia. Narzędzie find pomoże ci i w tym przypadku oferując kilka różnych opcji. Najprostsze z nich to -readable, -writable i -executable. Pozwalają one na szukanie plików, które odpowiednio mogą być czytanie, zapisywane, uruchamiane przez użytkownika wywołującego polecenie. Niestety parametry te nie są obsługiwane przez starsze wersje find, dlatego jeśli posiadasz jakąś starszą dystrybucję, to być może nie będziesz mógł z nich korzystać.
Jest jednak jeszcze inny sposób na szukanie plików z odpowiednimi uprawnieniami. Korzystając z opcji -perm możesz sprawdzić, które pliki posiadają określony przez ciebie zestaw uprawnień (chmod). Jeśli chcesz sprawdzić, które pliki mogą być uruchamiane przez ich właściciela i grupę, wywołaj:
find -type f -perm -110
Końcówka -110 informuje find, aby szukał wspomnianych plików i jednocześnie ignorował ich pozostałe uprawnienia. Nie ma więc znaczenia dla programu, czy pliki mogą być zapisywane przez właściciela – pokaże on po prostu wszystkie, które mogą być przez niego uruchamiane.
Jeśli chcemy znaleźć pliki posiadające tylko określony chmod, należy opuścić myślnik przed podawaną wartością. (dla porównania – w poprzednim przypadku szukaliśmy plików spełniających uprawnienia określonego chmodu).
A jeśli byś chciał znaleźć pliki, które mogą być uruchamiane przez właściciela lub przez grupę? I na to jest sposób, należy użyć / zamiast -.
find -type f -perm /110
Wystarczy, że plik będzie wykonywalny tylko przez użytkownika albo tylko przez grupę, aby został wyświetlony na liście.
Szukanie plików na podstawie uprawnień może być bardzo przydatne, ale jest niestety nieco skomplikowane, szczególnie dla osób nieobeznanych dobrze z chmodami. Dlatego można powiedzieć, że w tym jednym przypadku przeczytanie podręcznika man jest nie tylko zalecane, ale wręcz konieczne.

6. Korzystanie z wyrażeń regularnych

Czasami do znalezienia plików możesz potrzebować wyrażeń regularnych (części nazw tych plików). Oczywiście find zapewnia takie szukanie, być może nawet bardziej, niż się tego spodziewasz. Obsługuje on bowiem różnorodne typy składni wyrażeń regularnych. Wybrany typ np. posix-awk, posix-egrep możesz ustawić przy pomocy opcji -regextype. Aby uzyskać listę wszystkich obsługiwanych typów, zajrzyj do podręcznika man.
Szybki przykład: Załóżmy, że chcę znaleźć wszystkie pliki z rozszerzeniem .php lub .js. Mogę użyć do tego polecenia:
find -regextype posix-egrep -regex '.*(php|js)$'
Wygląda skomplikowanie, co nie? Postaram się więc omówić całość tego polecenia. Najpierw zaznaczam, że chcę użyć składni egrep (-regextype posix-egrep), a następnie podaję regularne wyrażenie, którego mam zamiar szukać. Wyrażenie zamknięte jest obustronnie w pojedynczych cudzysłowach, aby powłoka nie musiała sama określać, co tym wyrażeniem jest (mogłoby to spowodować błędy). Następnie znaki .* oznaczają każdy dowolny znak bądź ciąg znaków (find pokaże dzięki temu pliki o różnych nazwach). Potem mamy wyrażenie (php|js), które mówi, aby szukać w nazwach php lub js. Znak (|) oznacza w tym przypadku właśnie „lub”. Na samym końcu znajduje się znak dolara ($), który określa, że podanych wyrażeń należy szukać tylko i wyłącznie na końcu plików (bo w końcu są to ich rozszerzenia). W tym przypadku plik nazwany js.txt nie zostanie wyświetlony.
Podobnie jak w przypadku uprawnień, regularne wyrażenia są dość skomplikowane, dlatego zainteresowanych odsyłam do dokumentacji i podręcznika man po więcej informacji.

7. Znajdowanie plików na podstawie ich wieku

A co, jeśli będziesz chciał znaleźć pliki na podstawie czasu ich modyfikacji? Może się to przydać w sytuacji, gdy nie pamiętasz nazwy dokumentu, ale wiesz, że ostatnio pracowałeś nad nim dwa tygodnie temu albo w przypadku, gdy szukasz starych i niepotrzebnych plików, które można usunąć.
Narzędzie find pozwala na takie szukanie plików za pomocą kilku prostych parametrów. Możesz szukać na podstawie czasu dostępu (-atime) lub na podstawie czasu modyfikacji danych (-mtime) albo na podstawie czasu ostatniej zmiany statusu (-ctime).
Dla przykładu, znajdźmy pliki, które nie były modyfikowane przez ostatnie dwa dni:
find -mtime +2
Liczba jest tu interpretowana jako „n*24 godzin temu” i ogranicza ona zakres do jednej doby. To oznacza, że gdy podamy wartość +1, find przetłumaczy to sobie jako „przynajmniej 24 godziny temu, ale nie więcej jak 48 godzin temu”.
Choć powyższe wydaje się ograniczeniem, to na szczęście możemy używać kombinacji opcji, dla przykładu:
find -mtime +2 -mtime -5
znajdzie pliki, które były modyfikowane od dwóch do pięciu dni temu.

8. Znajdowanie plików dzisiaj modyfikowanych

Jeśli często pracujesz z wieloma różnymi plikami jednocześnie i czasami w ciągu jednego dnia masz ich tyle, że ciężko odnaleźć ci się w ich gąszczu, to z pewnością przydadzą ci się opcje -amin, -cmin oraz -mmin. Działają one analogicznie do wyżej wymienionych z tą różnicą, że operują na minutach, a nie na dobach. Jeśli chcesz więc znaleźć pliki, nad którymi pracowałeś dziś rano, to nic cię nie ogranicza ;)

9. Ograniczanie wyszukiwania rekurencyjnego

Czasami find pokazuje więcej wyników, niż tego potrzebujesz. W przypadku, gdy wiesz, że szukany przez ciebie plik jest w głównym katalogu z dokumentami, ale find niepotrzebnie pokazuje ci też pliki ze wszystkich podkatalogów, to możesz użyć opcji -maxdepth, aby ograniczyć rekurencyjne szukanie.
Poniższe polecenie odnajdzie wszystkie pliki JavaScript w instalacji wordpressa:
find wordpress -name '*js'
Kolejne natomiast pokaże wszystkie pliki JavaScript znajdujące się jedynie w głównym katalogu instalacji:
find wordpress -maxdepth 1 -name '*js'
Innymi słowami, pominięte zostaną przy wyszukiwaniu wszystkie podkatalogi. Zmiana wartości -maxdepth na 2 sprawi, że podkatalogi zostaną przeszukane, ale podkatalogi tych podkatalogów już nie.

10. Kombinacja find i innych poleceń

Skoro już znalazłeś pożądane pliki, to warto byłoby coś z nimi zrobić. Możesz użyć w tym celu narzędzia find w połączeniu z xargs lub z parametrem -exec.
Powiedzmy, że chcesz masowo zmienić uprawnienia wielu plików z root na www-data. Znalezienie wszystkich żądanych plików to w tym przypadku tylko pierwszy krok; następnie musisz zmienić ich przynależność. Oczywiście można zrobić to ręcznie korzystając z listy otrzymanej po wywołaniu polecenia find, aczkolwiek jest to trochę karkołomne zadanie, szczególnie przy setkach i tysiącach plików. Na szczęście wystarczy dodać opcję -exec do polecenia find, aby automatycznie zmienić uprawnienia:
find -user root -exec chown www-data {} \;
Powyższa komenda wskazuje, aby wszystkie wyniki polecenia find zostały przekazane do narzędzia chown, które następnie zmieni przynależność wskazanych plików z root na www-data. Proste :)

Podsumowanie

Znajomość narzędzia find jest koniecznością dla każdego użytkownika systemu Linux, który chce ten system w pełni opanować. Jeśli jesteś zwykłym userem korzystającym z KDE lub Gnome, to być może nigdy nie będziesz tego polecenia potrzebował. Jeśli natomiast jesteś administratorem jakiegoś serwera, to pewnie przyda ci się ono nieraz. Warto pamiętać, aby w przypadku używania parametrów -exec i xargs do zmiany lub usuwania plików, wykonać najpierw jeden test bądź dwa, by upewnić się, że wpisana przez nas komenda działa zgodnie z oczekiwaniami.

Jeśli znasz inne, ciekawe zastosowania narzędzia find i chciałbyś się nimi podzielić, to zapraszam do pisania komentarzy.

Powyższy tekst jest tłumaczeniem: 10 Tips for Using GNU Find

Komentarze (RSS)
Komentarze są prywatnymi opiniami dodających je osób. Prosimy o zachowanie kultury wypowiedzi. Komentarze obraźliwe oraz obniżające poziom serwisu będą usuwane. Więcej w regulaminie komentowania.

11 komentarzy

  1. Bastian 24 grudnia 2010 o godz. 11:55 #

    No wreszcie fajny artykuł. Ze tez nie zaglądnąłem do mana find..Dzięki przyda się.

  2. marek 24 grudnia 2010 o godz. 17:21 #

    I to wszystko potrzebne, by wyszukać plik… Przydałyby się jakieś nakładki w ncurses – swoją drogą – może istnieją takowe? A zamiast find polecam locate.

  3. Bastian 25 grudnia 2010 o godz. 12:31 #

    marek: jakie wszystko. Cytując Ciebie "(..)by wyszukać plik.." potrzebne jest tylko polecenie find / -name plik . To chyba nie jest az tak duzo co? Bardziej skomplikowane polecenia służą do bardziej skomplikowanego szukania. Logiczne? Logiczne.

  4. marek 25 grudnia 2010 o godz. 16:28 #

    Logiczne, ale niestety niekiedy nie znamy nazwy a jedynie fragment treści bądź np typ i date utworzenia. To jest bardzo dużo, bo musimy te wszystkie polecenia pamiętać lub non-stop przeglądać mana by być na bieżąco. Ile czasu zajmie Ci znalezienie takiego pliku? Oczywiście, szukając miliona zgubionych plików znajomość składni jest nieoceniona, ale jak zgubi Ci się jeden, to więcej czasu stracisz na przestudiowanie mana czy tego artykułu niż na właściwe poszukiwania. Tak samo jest ze screenem, vimem, ssh. Niby nie trzeba wiele tak jak piszesz, ale często te "niewiele" (czyli wywołanie programu z jakimś tam parametrem) jest niewystarczające. Przykład idealnie zrealizowanego programu konsolowego: nakładka wicd-ncurses. Szybko, sprawnie i efektywnie.

  5. 3ED 27 grudnia 2010 o godz. 8:07 #

    marek: A catfish czy inny tego typu program-nakładka może Ci starczy? :)

    BTW. locate umie tylko szybko wyświetlać spis plików i ma zawężoną zawartość zindeksowanych danych.

    Pozdrawiam

  6. james 30 grudnia 2010 o godz. 0:39 #

    Bardzo sympatyczny artykuł. Dodaję go do zakładek.

  7. dieloman 1 stycznia 2011 o godz. 21:20 #

    A ja od zawsze używam:

    find / -iname plik

  8. lama 6 stycznia 2011 o godz. 23:30 #

    wcale nie trzeba daleko szukać front-endu, np. w Ubuntu: Miejsca->Wyszukaj pliki…

    gnome-search-tool oparte o polecenia: find, locate i grep. jak dla mnie bardzo wygodne i szybkie narzędzie.

    artykuł super! dzięki!

  9. james 11 lutego 2011 o godz. 18:44 #

    dla uzupełnienia, rozwinę ostatni punkt. Finf potrafi efektywnie przeglądać zawartość pliku. Poniżej przykład jak znaleźć dokument zawierający słowo hello:

    find . -exec grep hello {} ;

  10. james 11 lutego 2011 o godz. 18:45 #

    find . -exec grep hello {} ; -print

  11. Tylko spokojnie 8 października 2011 o godz. 16:48 #

    można też użyć mc

(wymagane)
URI
Uwaga! Niektóre komentarze, m.in. te dodane przez niezalogowanych i nowych użytkowników, są ręcznie moderowane. Jeśli Twój komentarz nie ukaże się od razu, nie dodawaj go ponownie, tylko cierpliwie poczekaj na akceptację.

Literówki najlepiej zgłaszać jabberem: michuk@jakilinux.org lub kocio@jabber.org!

W komentarzach możesz używać prostych znaczników HTML. Przykłady:
  • Link: <a href="jaklinux.org">Linux dla każdego</a>,
  • Wytłuszczenie: <strong>tekst pogrubiony</strong>,
  • Kursywa: <em>tekst pochylony</em>,
  • Przekreślenie: <del>tekst przekreślony</del>,
  • Kod: <code>printf("blok kodu");</code>,
  • Cytat: <blockquote>cytat</blockquote>
Uwaga: jeśli dodasz nieznany znacznik, będzie on niewidoczny, gdyż system filtruje takie znaczniki.