Do wyszukiwania plików z wiersza poleceń (terminal) najczęściej używana jest komenda find. Jest to narzędzie o naprawdę dużych możliwościach, niedostępnych dla programów z interfejsem okienkowym. Do modyfikowania kryteriów wyszukiwania służą oczywiście dodatkowe parametry. Poniżej przykłady zastosowania find.
Zrób listę wszystkich plików w bieżącym katalogu roboczym i jego podkatalogach
find
lub
find .
find . -print
Jak wiadomo kropka oznacza bieżący katalog a -print jest domyślnym zachowaniem polegającym na wypisaniu nazwy znalezionego pliku na standardowy wyjściu (nazwa pliku zakończona jest markerem końca linii).
Znajdź w katalogu test, który znajduje się w bieżącym katalogu roboczym plik o nazwie „abc.txt”. Jeżeli ścieżka do katalogu zawiera spacje należy poprzedzić je slash’em \ lub całą ścieżkę podać w pojedynczym lub podwójnym cudzysłowie. Początkowe ./ można przeważnie opuścić (pod warunkiem, że katalog nie jest symlinkiem – dowiązaniem symbolicznym – wskazującym na inny katalog). Do wyszukiwania pliku wg. nazwy wprowadzamy parametr –name.
find ./test -name "abc.txt"
Znajdź w bieżącym katalogu pliki z rozszerzeniem „.txt” (gwiazdka oznacza dowolny ciąg znaków, w tym ciąg pusty)
find . -name "*.txt"
Przy wyszukiwaniu wygodną opcją jest ignorowanie wielkości liter. Służy do tego parametr –iname.
find . -iname "*.txt"
W tym przypadku odszukane zostaną pliki z rozszerzeniami: txt, TXT, Txt, tXt, txT. Gdy stosujemy znaki typu wildcards (znaki o specjalnym znaczeniu dla powłoki, np. *) nazwę trzeba umieścić w pojedynczym lub podwójnym cudzysłowie.
Find przeszukuje drzewo katalogów rekurencyjnie. Aby ograniczyć głębokość penetracji możemy zastosować parametry –maxdepth (maksymalna głębokość) i –mindepth (minimalna głębokość), przy czym „-maxdepth 1″ oznacza wyszukiwanie tylko na najwyższym poziomie.
Znajdź w bieżącym katalogu, nie wchodząc w podkatalogi, pliki z rozszerzeniem .png
find . -maxdepth 1 -iname "*.png"
Do zanegowania kryterium wyszukiwania służy parametr -not lub ! (wykrzyknik).
Wyszukaj w bieżącym katalogu pliki, które nie mają rozszerzenia .png
find . -not -iname "*.png"
lub
find . ! -iname "*.png"
Wyszukaj w folderze „wordpress” pliki, które zaczynają się na „word”, ale nie kończą się na „.php”.
find ./wordpress -iname "word*" ! -iname "*.php"
Parametr -o wprowadza operator OR (lub).
Wyszukaj w folderze „wordpress” (i jego podkatalogach) pliki, które kończą się na „.php” lub „.css”
find ./wordpress -iname "*.php" -o -iname "*.css"
find odróżnia pliki od katalogów. Jeżeli szukamy plików do listy parametrów dodajemy „-type f”, a jeśli katalogów „-type d”.
Wyszukaj w bieżącym katalogu podkatalogi, których nazwa zaczyna się od słowa „backup” (kopia zapasowa).
find . -type d -iname "backup*"
Wyszukaj w bieżącym katalogu pliki, których nazwa zaczyna się od słowa „backup”
find . -type f -iname "backup*"
Wyszukiwanie można prowadzić równocześnie w kilku katalogach, które są od siebie niezależne.
find ./var ./home -type f -iname "backup*"
Wyszukaj w katalogu domowym (~) wszystkie ukryte pliki (zaczynają się od kropki).
find ~ -type f -name ".*"
Wyszukaj w bieżącym katalogu – nie wchodząc w podkatalogi – pliki, które mają uprawnienia do odczytu i zapisu dla swojego właściciela i jego grupy, a inni użytkownicy mogą je czytać, ale nie mogą do nich zapisywać.
find . -perm 664
Wyszukaj w katalogu wordpress pliki z atrybutem „wykonywalny” dla bieżącego użytkownika
find ./wordpress -type f -executable
Znajdź w drzewie głównego katalogu pliki należące do użytkownika guest
find / -user guest -type f
Znajdź w katalogu domowym pliki modyfikowane w ciągu ostatnich 7 dni
find ~ -mtime 7
Znajdź w katalogu domowym pliki otwierane w ciągu ostatnich 7 dni
find ~ -atime 7
Znajdź w katalogu domowym pliki modyfikowane w przedziale od 7 do 14 dni temu
find ~ -mtime +7 -mtime -14
Znajdź w katalogu domowym pliki modyfikowane w ciągu ostatnich 30 minut
find ~ -mmin -30
Znajdź w katalogu domowym pliki otwierane w ciągu ostatnich 30 minut
find ~ -amin -30
Znajdź w katalogu domowym pliki większe niż 100M
find ~ -size +100M
Znajdź w katalogu domowym pliki większe niż 50M, ale mniejsze niż 100M
find ~ -size +50M -size -100M
Znajdź w bieżącym katalogu (i jego podkatalogach) 5 największych plików
find . -type f -exec ls -s {} \; | sort -nr | head -5
Znajdź w bieżącym katalogu 5 najmniejszych plików (ale nie wchodź do podkatalogów)
find . -maxdepth 1 -type f -exec ls -s {} \; | sort -n | head -5
Znajdź w katalogu domowym puste podkatalogi
find ~/ -type d -empty
Znajdź w katalogu domowym puste pliki
find ~/ -type f -empty
Wyszukane pliki możemy przetwarzać przy pomocy innych poleceń.
Wyszukaj w bieżącym katalogu puste pliki a następnie je usuń bez pytania o potwierdzenie (OSTROŻNIE! usuwanie bez potwierdzenia zawsze jest ryzykowne)
find . -type f -empty -exec rm -f {} \;
Wyszukaj w bieżącym katalogu puste pliki a następnie je usuń. Przed usunięciem zapytaj o potwierdzenie.
find . -type f -empty -exec rm -i {} \;
Usuń z katalogu domowego pliki logów większe niż 50M pytając przed usunięciem o potwierdzenie.
find ~ -type f -iname *.log -size +50M -exec rm -i {} \;
Znajdź w katalogu wordpress pliki z atrybutem „wykonywalny” dla bieżącego użytkownika i usuń prawo do wykonywania.
find ./wordpress -type f -executable -exec chmod -x {} +
Podobną funkcjonalność jak –exec ma xargs. Żeby przetwarzać nazwy plików i katalogów przy pomocy xargs musimy wprowadzić parametr –print0, który oddziela nazwy plików przy pomocy znaku ASCI null zamiast domyślnego dla -print newline (nowa linia). Żeby xargs zaakceptował znaki ASCI null musimy go poinformować przy pomocy parametru -0, że taki znak będzie kończył linię. Jeżeli nie wprowadzimy powyższych modyfikacji każda spacja w nazwie pliku zwracanej przez find będzie rozpoznawana jako koniec linii a tekst po spacji odczytywany jako nowa ścieżka, co oczywiście wygeneruje nam masę błędów. Pionowa kreska | oznacza, że włączyliśmy przetwarzanie potokowe (pipes).
W bieżącym katalogu przejrzyj wszystkie pliki z rozszerzeniem .txt i wypisz nazwy tych, które zawierają słowo „karuzela”
find . -type f -print0 -name "*.txt" | xargs -0 grep -l karuzela
Możemy poprosić xargs, żeby przed wykonaniem polecenia poprosiło nas o potwierdzenia. Służy do tego parametr -p
find . -type f -name "*.txt" | xargs -p rm
Domyślnie xargs wstawia argument, który otrzymuje w potoku na samym końcu polecenia. Tymczasem wiele komend oczekuje na argument w innym miejscu. Z pomocą przychodzi tu zmienna {}, która przechowuje argument i opcja -I.
Znajdź w bieżącym katalogu pliki z rozszerzeniem .txt a następnie przenieś je do nowego katalogu
find . -type f -name "*.txt" | xargs -p -I {} mv {} /nowy/katalog/
Można to rozumieć w ten sposób, że xargs otrzymuje of find listę plików, którą przechowuje w zmiennej {}. Następnie kolejne nazwy plików z tej listy przekazuje do komendy mv.
Zmiennych, przechowujących wyjście potoku można użyć do wykonania wielu komend po xargs. W kodzie poniżej sh oznacza wywołanie interpretera powłoki (shell), parametr -c oznacza, że komendy mają być odczytane z łańcucha tekstowego (otoczony pojedynczym cudzysłowem).
find . -type f -name "*.txt" | xargs -I {} sh -c 'ls -l {}; du -h {}'
Podręczniki man dla find i xargs