#Linux – Wyszukiwanie plików

Do wyszukiwania plików w systemie Linux używa się polecenia find. Jego możliwości są bardzo szerokie, bowiem umożliwia wyszukiwanie w dowolnej lokalizacji rekursywnie a jako parametr może przyjąć nazwę pliku, rozszerzenie, wyrażenie regularne czy datę modyfikacji, Umożliwia także masowe usuwanie lub zmianę uprawnień wszystkich plików spełniających kryteria wyszukiwania.

Ogólna składnia polecenia find

Czyli jak ogólnie używać polecenia. Składania wygląda następująco:

find <options> <path> <expression>

Omówienie:

  • Atrybut „options” określa dodatkowe parametry wyszukiwania, umożliwiając jego optymalizację i precyzowanie,
  • Atrybut „path” określa, z jakiego folderu zaczynać wyszukiwanie (bierze pod uwagę również foldery znajdujące się wewnątrz wskazanej lokalizacji),
  • Atrybut „expression” określa wyrażenie określające nazwę pliku – może to być nazwa lub opis nazwy

Przykłady użycia polecenia find

Wyszukaj po nazwie

Najprostsze wyszukiwanie po nazwie – należy użyć parametru name. Nie wskazujemy lokalizacji, więc wyszukiwanie rozpocznie się od folderu, w którym aktualnie się znajdujesz i rekursywnie przeszuka także foldery wewnątrz.

find -name plik.txt # plik o nazwie plik.txt od bieżącego katalogu

Aby wyszukać bez względu na wielkość liter, zastosuj parametr iname.

find -iname plik.txt # plik o nazwie plik.txt bez względu na wielkość liter od bieżącego katalogu

Wyszukaj w konkretnej lokalizacji

Możesz także doprecyzować wyszukiwanie, określając lokalizację startową. Wpisz „.” (kropkę), wtedy wyszukiwanie rozpocznie się od folderu wyżej. Wpisz „/” (slash), wtedy wyszukiwanie odbędzie się w całym systemie plików. Wpisz dokładną lokalizację, żeby to w niej wyszukać.

find . -name plik.txt # plik o nazwie plik.txt od katalogu wyżej
find / -name plik.txt # plik o nazwie plik.txt w całym systemie plików
find /var plik.txt    # plik o nazwie plik.txt w katalogu /var

Wyszukiwanie jest zawsze rekurencyjne, ale możesz określić, na ile poziomów głębokości ma się ono odbyć, tj. ile katalogów wewnątrz ma zostać przeszukane. W tym celu użyj parametru maxdepth.

find /var plik.txt -maxdepth 2 # plik o nazwie plik.txt w katalogu /var ale maksymalnie 2 poziomy wgłąb

Wyszukaj po rozszerzeniu

Nie musisz podawać konkretnej nazwy. Wpisanie „*” (gwiazdki) zastępuje dowolny ciąg znaków.

find -name *.jpg # wyszuka każdy plik o rozszerzeniu jpg od bieżącego katalogu

Wyszukaj puste pliki

Wykorzystaj dwa dodatkowe parametry, parametr type określający, co chcesz wyszukać (wartość „f” dla plików) oraz parametr empty.

find . -type f -empty
 # wyszuka puste pliki od katalogu wyżej

Wyszukaj katalogi

Możesz także wyszukać katalogi. W tym celu wykorzystaj parametr type z wartością „d”.

find . -name log -type d # wyszuka katalogi o nazwie log od katalogu wyżej

Wyszukaj po dacie modyfikacji

Wykorzystaj parametr mtime, aby określić, ile maksymalnie dni temu plik musiał zostać zmodyfikowany.

find . -type f -mtime -3 # wyszuka pliki modyfikowane w ciągu 3 ostatnich dni od katalogu wyżej

Wyszukaj niespełniające zapytania

Możesz wyszukiwać pliki, określając jakiego wyrażenia mają one nie spełniać. W tym celu wykorzystaj parametr not.

find . -type f -not -name *.html # wyszuka pliki o rozszerzeniu innym niż html od katalogu wyżej

Wykonaj operację na znalezionych plikach

Możesz od razu zastosować operacje na znalezionych plikach. Możesz nadać im odpowiednie uprawnienia czy zmienić ich ostatni czas użycia. W tym celu użyj parametru exec, który wykona zadaną akcję dla każdego wyniku wyszukiwania.

find . -name "plik.txt" -exec chmod o+r '{}' \;
 # nadaje uprawniania dla plików plik.txt od katalogu wyżej
find . -name "plik.txt" -exec touch '{}' \;     # ustawia ostatni czas użycia na teraz dla plików plik.txt od katalogu wyżej

Usuń znalezione plikis

Aby usunąć pliki, możesz użyć parametru exec z poleceniem rm, ale wygodniej będzie skorzystać z parametru delete.

find . -name "*.txt" -delete
 # usuwa pliki o rozszerzeniu txt od katalogu wyżej

Wyszukiwanie jest zbyt wolne?

Wypróbuj polecenie fd. Jest to alternatywa dla standardowego polecenia find napisana w Rust. Zaletą jest oczywiście, duża szybkość, wadą – ograniczona funkcjonalność skupiona wokół najpotrzebniejszych przypadków użycia. Aby z niej skorzystać, zainstaluj odpowiedni pakiet.

sudo apt update
sudo apt install fd-find

Ogólna składnia polecenia fd

Użycie jest bardzo proste.

fd wyrażenie

Przykłady użycia polecenia fd

Wyszukiwanie po nazwie

Wpisz część nazwy lub pełną nazwę. Możesz uzyć „*” (gwiazdki) aby zastąpić część nazwy.

find log # wyszuka pliki zawierające log

Wyszukiwanie wyrażeniem regularnym

Zapytanie domyślnie jest traktowane jako wyrażenie regularne. Należy je umieścić w cudzysłowie/apostrofie, rozpocząć ^ (dash) a zakończyć $ (dolarem). Wewnątrz można stosować dowolne wyrażenia regularne. Poniższy przykład wyszuka wszystkie pliki zaczynające się słowem log i kończące się słowem txt.

fd '^log.*txt$' # wyszuka pliki zaczynające się słowem log i kończące się słowem txt

Wyszukiwanie w konkretnej lokalizacji

Po nazwie wyszukiwanego pliku określ lokalizację.

find log /var # wyszuka pliki zawierające log w nazwie w katalogu /var

Więcej sposobów wyszukiwania

Więcej przypadków użycia znajdziesz na Githubie autorów.