find

Wyszukuje pliki i katalogi po nazwie, rozmiarze, dacie i innych kryteriach oraz wykonuje na nich akcje.

find to terminalowy kombajn do przeszukiwania drzewa katalogów. Zamiast klikać po folderach, podajesz mu punkt startowy i zestaw kryteriów (nazwa, rozmiar, data modyfikacji, typ pliku, uprawnienia), a on rekursywnie schodzi w głąb i wypluwa pasujące ścieżki. Co więcej, na znalezionych plikach potrafi od razu coś zrobić: usunąć je, zmienić uprawnienia albo przepuścić przez dowolne polecenie. Dla admina i osoby uczącej się Linuksa to jedno z tych narzędzi, które używasz codziennie, często sklejone z grep, xargs czy rm.

Składnia i najważniejsze opcje

Podstawowa forma to find [ŚCIEŻKA] [WYRAŻENIE] — najpierw mówisz gdzie szukać, potem czego.

  • -name "wzorzec" — szuka po nazwie (z uwzględnieniem wielkości liter); obsługuje globy typu *.log.
  • -iname "wzorzec" — to samo, ale ignoruje wielkość liter.
  • -type — filtruje po typie: f (plik), d (katalog), l (dowiązanie symboliczne).
  • -size — po rozmiarze, np. +100M (większe niż 100 MB), -1k (mniejsze niż 1 KB).
  • -mtime n / -mmin n — po dacie modyfikacji w dniach / minutach; -mtime -7 to „zmienione w ostatnim tygodniu”.
  • -maxdepth n — ogranicza głębokość schodzenia w podkatalogi (w GNU musi stać przed testami).
  • -exec polecenie {} \; — uruchamia polecenie na każdym wyniku ({} to znaleziona ścieżka).
  • -delete — kasuje to, co znalazł.

Przykłady użycia

  • find . -name "*.log" — wszystkie pliki z rozszerzeniem .log w bieżącym katalogu i poniżej.
  • find /var/log -type f -mtime +30 — pliki w /var/log niemodyfikowane od ponad 30 dni (klasyka przy sprzątaniu logów).
  • find . -type f -size +100M — znajduje grubasy ważące więcej niż 100 MB, gdy dysk niespodziewanie się zapełnił.
  • find . -name "*.tmp" -delete — kasuje wszystkie pliki tymczasowe jednym strzałem.
  • find /home -name "*.sh" -exec chmod +x {} \; — nadaje prawa wykonywania wszystkim skryptom shellowym w katalogach domowych.

Częste błędy i pułapki

Kolejność ma znaczenie. Ścieżka idzie przed wyrażeniem — find -name "*.txt" . potraktuje kropkę jako część warunku i się pogubi. Zapisuj find . -name "*.txt".

Cudzysłowy przy wzorcach. Bez nich, np. find . -name *.log, to powłoka rozwinie *.log zanim find w ogóle ruszy. Zawsze cytuj: -name "*.log".

GNU (Linux) kontra BSD (macOS). Na Linuksie możesz pominąć ścieżkę (domyślnie bierze .), na macOS musisz ją podać jawnie. Część opcji też się różni, więc man find na obcym systemie bywa zbawienny.

-delete nie pyta o zdanie. Nie ma kosza ani potwierdzenia. Najpierw odpal samo wyszukiwanie, obejrzyj listę, dopiero potem dopisz -delete. To samo dotyczy -exec rm.

Komendy pokrewne: locate (szybsze, ale po indeksie), grep (przeszukiwanie treści, nie nazw), xargs (do przekazywania wyników), which i whereis (lokalizowanie programów).