Wyszukiwanie plików przy pomocy „find”

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)

Wyszukaj w bieżącym katalogu puste pliki a następnie je usuń. Przed usunięciem zapytaj o potwierdzenie.

Usuń z katalogu domowego pliki logów większe niż 50M pytając przed usunięciem o potwierdzenie.

Znajdź w katalogu wordpress pliki z atrybutem „wykonywalny” dla bieżącego użytkownika i usuń prawo do wykonywania.

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”

Możemy poprosić xargs, żeby przed wykonaniem polecenia poprosiło nas o potwierdzenia. Służy do tego parametr -p

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

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).

Podręczniki man dla find i xargs