Potężne polecenie find w systemie Linux
Polecenie `find` w systemie Linux jest niezwykle użytecznym narzędziem, które pozwala administratorom systemów na precyzyjne wyszukiwanie plików i katalogów oraz zarządzanie nimi. Daje możliwość odnajdywania elementów na podstawie rozmaitych kryteriów, takich jak nazwa, typ, rozszerzenie, rozmiar, uprawnienia i wiele innych.
Oprócz samego wyszukiwania, `find` w połączeniu z innymi poleceniami umożliwia wykonywanie akcji na znalezionych wynikach. Dzięki opcji `-exec` można uruchamiać zewnętrzne polecenia, co pozwala na automatyzację takich zadań, jak kopiowanie, przenoszenie, usuwanie lub modyfikowanie uprawnień plików spełniających określone warunki. Przykładowo, można wyszukać pliki o określonym rozmiarze i natychmiast je skopiować w inne miejsce.
W niniejszym artykule przedstawimy podstawowe zasady działania polecenia `find` na przykładach. Dowiesz się, jak wyszukiwać pliki i katalogi. Następnie zaprezentujemy, jak korzystać z opcji `-exec`, aby wykonywać operacje na plikach i katalogach na podstawie ich cech, jak rozmiar czy uprawnienia.
Ogólna forma polecenia `find` wygląda następująco:
find {ścieżka} {wzorzec-wyszukiwania} {akcja}
Gdzie:
- `ścieżka` to katalog, w którym ma być prowadzone wyszukiwanie.
- `wzorzec-wyszukiwania` to nazwa pliku lub katalogu, ewentualnie wzorzec (np. z użyciem `*`), który ma być odnaleziony.
- `akcja` to działanie, które ma zostać wykonane na znalezionych elementach, np. kopiowanie, usuwanie, przenoszenie.
W tym przewodniku nauczymy się, jak lokalizować pliki i katalogi pasujące do określonych kryteriów. Pokażemy również, jak wykonywać działania na obiektach odnalezionych przez polecenie `find`. Ten przewodnik jest oparty na systemie Ubuntu, ale z powodzeniem można go stosować na większości dystrybucji i wersji systemu Linux.
Wyszukiwanie plików i katalogów
Wyszukiwanie plików według nazwy lub rozszerzenia
Aby znaleźć konkretny plik, uruchom poniższe polecenie z katalogu głównego (`/`). Polecenie zawiera dokładną nazwę poszukiwanego pliku.
find . -name file22.txt
Wynik:
./test/file22.txt ./sales/file22.txt
Zwróć uwagę, że wynik zawiera ścieżkę do pliku. Jest to bardzo przydatne, zwłaszcza gdy nie jesteśmy pewni, w jakim katalogu znajduje się poszukiwany plik, lub gdy występuje on w kilku miejscach.
Możesz także wyszukać plik w innym katalogu, nie zmieniając swojej bieżącej lokalizacji. W takim przypadku należy podać ścieżkę do katalogu, w którym chcesz przeprowadzić wyszukiwanie.
find ./test -name file22.txt
Wyszukiwanie plików o pasującej nazwie
W tym przykładzie będziemy szukać wszystkich plików, których nazwa zaczyna się od „file” w katalogu `test`.
find ./test -name file*
Wynik:
./test/file22.txt ./test/file30.doc ./test/file1.txt ./test/file5,doc
Wyszukiwanie plików według rozszerzenia
Aby wyszukać pliki z określonym rozszerzeniem, dodaj odpowiedni wzorzec do polecenia.
find . -name *.txt
Wynik:
./test/subtest/subfil.txt ./test/file22.txt ./test/file1.txt ./home1/files32.txt ./home2/file22.txt ./qa/tags.txt
Wyszukiwanie plików i katalogów według nazwy
Użyj poniższego polecenia, aby wyszukać pliki i katalogi, których nazwy zaczynają się od „qa”. W naszym systemie istnieją pliki `qatree.txt` i `qa.txt` oraz katalog o nazwie `qa`.
Po uruchomieniu polecenia:
find ./ -name "qa*"
Otrzymamy następujący wynik:
./test/qatree.pdf ./test/qa.txt ./home/qa
Polecenie zwraca zarówno pliki, jak i katalogi spełniające kryteria. Aby wyszukać tylko pliki lub tylko katalogi, należy to wyraźnie określić.
Wyszukiwanie tylko plików lub tylko katalogów
Aby wyszukać tylko pliki, użyj opcji `-type f`.
Wyszukiwanie tylko plików:
find ./ -type f -name "qa*"
Wynik:
./test/qatree.pdf ./test/qa.txt
Aby wyszukać tylko katalogi, użyj opcji `-type d`.
Wyszukiwanie tylko katalogów:
find ./ -type d -name "qa*"
Wynik:
./home/qa
Wyszukiwanie bez uwzględniania wielkości liter
Domyślne wyszukiwanie z opcją `-name` rozróżnia wielkość liter. Aby wyszukać elementy niezależnie od wielkości liter, użyj opcji `-iname`.
find ./ -iname "qa*"
Wynik:
./test/qatree.pdf ./test/qa.txt ./test/QAtest.txt ./home/qa
Wyszukiwanie w wielu katalogach
Aby wyszukać w wielu katalogach jednocześnie, wystarczy podać ścieżki do nich w poleceniu. W tym przykładzie przeszukamy katalogi `test` i `numeric`.
find ./test ./numeric -name file22.txt -type f
Wynik:
./test/file22.txt /root/numeric/file22.txt
Wyszukiwanie plików o różnych rozszerzeniach
Polecenie `find` umożliwia wyszukiwanie plików o różnych rozszerzeniach, takich jak `*.doc`, `*.txt`, `*.pdf` itd. Można to zrobić oddzielnie dla każdego rozszerzenia lub za pomocą jednego polecenia uwzględniającego wszystkie pożądane rozszerzenia.
Przykład:
find . -type f ( -name "*.txt" -o -name "*.pdf" -o -name "*.doc" )
Wynik:
./test/subtest/subfil.txt ./test/qatree.pdf ./test/file22.txt ./test/qa.txt ./test/file30.doc ./books/acro.pdf ./data1/FILE22.txt ./docs/files32.txt
Wyszukiwanie plików zawierających określony tekst
Czasami potrzebujemy znaleźć plik zawierający określony tekst, ale nie pamiętamy jego nazwy ani lokalizacji. Polecenie `find` w połączeniu z `grep` pozwala odnaleźć wszystkie pliki zawierające poszukiwaną frazę.
Przykład wyszukiwania wszystkich plików zawierających słowo „hiperkonwergencja”:
find / -type f -exec grep -l -i "hyperconvergence" {} ;
Wynik:
/root/numeric/hci /root/HCIP
Opcja `-i` sprawia, że wyszukiwanie ignoruje wielkość liter, co pozwala na znalezienie tekstu pisanego zarówno dużymi, jak i małymi literami.
Aby wyszukać pliki w konkretnym katalogu, dodaj jego ścieżkę do polecenia:
find ./numeric -type f -exec grep -l -i "hyperconvergence" {} ;
Wynik:
./numeric/hci
Wyszukiwanie plików i katalogów na podstawie rozmiaru
Możemy wyszukiwać pliki i katalogi mniejsze, równe lub większe od określonego rozmiaru, mieszczące się w danym przedziale lub puste. W zależności od typu plików i katalogów, których szukamy, stosujemy odpowiedni format rozmiaru.
Dostępne opcje rozmiaru to:
c – bajty
k – kilobajty
M – megabajty
G – gigabajty
Wyszukiwanie plików o określonym rozmiarze (np. 30 MB)
Aby znaleźć wszystkie pliki o rozmiarze 30 MB, użyjemy polecenia:
find / -size 30M
Wyszukiwanie plików większych niż określony rozmiar
Aby znaleźć pliki większe niż 2 MB:
find -size +2M
Wynik:
./Downloads/ubuntu18043.iso ./.cache/pip/http/6/e/3/8/3/6e38383f41850c3e5705d48116bc52f81b92a80500f4143050577a9c
Wyszukiwanie plików mniejszych niż 10 MB
Aby znaleźć pliki mniejsze niż 10 MB w bieżącym katalogu:
find . -type f -size -10M
Wyszukiwanie plików o rozmiarze z przedziału od 100 do 200 MB
Aby znaleźć pliki, których rozmiar mieści się między 100 a 200 MB:
find / -size +100M -size -200M
Wyszukiwanie katalogów większych niż 20 KB
find / -type d -size +20k
Wyszukiwanie pustych plików i katalogów
Puste pliki:
find ./ -type f -size 0
Lub:
find ./ -type f -empty
Puste katalogi:
find ./ -type d -empty
Wyszukiwanie plików według wieku lub czasu modyfikacji
Wyszukiwanie plików starszych niż N dni:
find /ścieżka/ -type f -name '*.txt' -mtime +8
Powyższe polecenie wyszuka pliki z rozszerzeniem `txt` starsze niż 8 dni.
Wyszukiwanie plików według daty modyfikacji
Poniższe polecenie wyszuka pliki zmodyfikowane w ciągu ostatnich 17 godzin:
find . -mtime -17 -type f
Poniższe polecenie wyszuka katalogi zmodyfikowane w ciągu ostatnich 10 dni:
find . -mtime -10 -type d
Wyszukiwanie plików na podstawie czasu dostępu lub modyfikacji
Możemy wyszukiwać pliki na podstawie daty i godziny ostatniego dostępu. Pozwala to na sprawdzenie, które pliki były używane w danym okresie.
Aby wyświetlić pliki, do których nie uzyskano dostępu w ciągu ostatnich 10 dni w katalogu domowym:
find /home -atime +10
Aby wyświetlić pliki, do których uzyskano dostęp dokładnie 10 dni temu:
find /home -atime 10
Aby wyświetlić pliki, do których uzyskano dostęp w ciągu ostatnich 10 dni:
find /home -atime -10
Wyszukiwanie plików zmodyfikowanych w ciągu ostatnich N dni
Możemy wyszukać pliki zmodyfikowane w ciągu ostatnich 10 dni w katalogu `/home`:
find /home -mtime -10
Wyszukiwanie plików zmodyfikowanych w określonym przedziale czasowym
Przykład: wyszukiwanie wszystkich plików zmodyfikowanych od 6 do 15 dni temu w katalogu domowym:
find /home -type f -mtime +6 -mtime -15
Wyszukiwanie plików i katalogów, do których uzyskano dostęp w ciągu ostatnich 10 minut
Aby znaleźć pliki, do których uzyskano dostęp w ciągu ostatnich 10 minut, użyj opcji `-amin`.
find . -amin -10 -type f
Wynik:
./.bash_history ./[email protected]:~#
Aby wyszukać katalogi, do których uzyskano dostęp w ciągu ostatnich 10 minut:
find . -amin -10 -type d
Wyszukiwanie plików pasujących do określonych uprawnień
Składnia polecenia:
find -perm mode
gdzie `mode` to uprawnienie, które może być określone w postaci numerycznej (np. 644, 655, 700, 777) lub literowej (np. u=x, a=r+x).
Uprawnienia można określić na trzy sposoby:
- Bez prefiksu – wyszukiwanie plików z dokładnie określonymi uprawnieniami.
- Z „-” – wyszukiwanie plików z co najmniej określonymi uprawnieniami (mogą mieć dodatkowe uprawnienia).
- Z „/” – określenie, że właściciel lub grupa ma uprawnienia do pliku.
Wyszukiwanie plików z uprawnieniami 777
find -perm 777
Wynik:
./file1
Wyszukiwanie plików z uprawnieniami co najmniej 766
find -perm -766
Wynik:
./file2 ./file1
Polecenie wyszuka pliki, w których:
- Właściciel pliku ma uprawnienia do odczytu/zapisu/wykonania.
- Grupa ma uprawnienia do odczytu/zapisu.
- Inni mają uprawnienia do odczytu/zapisu.
Zostaną zwrócone pliki spełniające te kryteria, w tym pliki o wyższych uprawnieniach.
Wyszukiwanie plików, które mogą być zapisywane przez właściciela
Użyjemy „/” aby wyszukać pliki, które mogą być zapisywane przez właściciela, grupę lub innych użytkowników.
find -perm /222
Wynik:
. ./file2 ./file3 ./file1
Powyższe polecenie wyszuka pliki, które mogą być zapisywane przez ich właściciela lub grupę. Zostaną zwrócone pliki, które mogą być zapisywane przez jedną z tych grup, ale niekoniecznie obie. Aby zobaczyć pliki, gdzie obie grupy mają uprawnienia do zapisu, użyj przedrostka „-„.
find -perm -220
Wynik:
./file2 ./file1
Wyszukiwanie plików należących do użytkownika
Wyszukiwanie wszystkich plików należących do użytkownika `jack`:
find /home -user jack
Wynik:
/home/jack /home/jack/examples.desktop /home/jack/.gnupg /home/jack/.gnupg/private-keys-v1.d /home/jack/ans.cgi
Wyszukiwanie określonych plików należących do użytkownika
Wyszukiwanie wszystkich plików tekstowych należących do użytkownika `jack`:
find /home -user jack -iname "*.txt"
Wynik:
/home/jack/docs/file32.txt
Wyświetlanie plików i katalogów wraz z ich uprawnieniami
find -name "*.conf" | ls -l
Wynik:
total 120 drwxr-xr-x 2 root root 4096 Dec 31 13:19 backup2 drwxr-xr-x 2 root root 4096 Jan 4 11:57 Desktop drwxr-xr-x 2 root root 4096 Dec 31 11:50 Documents drwxr-xr-x 2 root root 4096 Dec 31 12:27 Downloads -rw-r--r-- 1 root root 0 Jan 4 12:02 file22.doc drwxr-xr-x 2 root root 4096 Jan 4 12:14 file23 -rw-r--r-- 1 root root 0 Jan 4 12:23 file23.txt
Wyszukiwanie i wykonywanie akcji na wynikach
W tej sekcji omówimy, jak wykonywać akcje na plikach, które pasują do wzorca określonego w poleceniu `find`.
Wyszukiwanie plików i zmiana ich uprawnień
Możemy wyszukiwać pliki danego typu i zmieniać ich uprawnienia. W tym przykładzie będziemy pracować z plikami PHP o różnych uprawnieniach:
[email protected]:~/ver$ ls -la total 8 drwxrwxr-x 2 jack jack 4096 Jan 3 14:11 . drwxr-xr-x 8 jack jack 4096 Jan 3 14:05 .. -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 ans.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 base.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 query.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 qust.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 text.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 vary.php
Teraz wyszukamy wszystkie pliki PHP i zmienimy ich uprawnienia na 755.
find ver -name "*.php" -type f -exec chmod 755 {} ;
Powyższe polecenie wyszuka pliki PHP w katalogu `ver` i ustawi ich uprawnienia na 755 (`rwxr-xr-x`).
Wynik:
[email protected]:~/ver$ ls -la total 8 drwxrwxr-x 2 jack jack 4096 Jan 3 14:11 . drwxr-xr-x 8 jack jack 4096 Jan 3 14:05 .. -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 ans.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 base.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 query.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 qust.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 text.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 vary.php
Wyszukiwanie i zmiana uprawnień plików i katalogów
Aby znaleźć pliki z uprawnieniami 644 i zmienić je na 655:
find . -type f -perm 644 -exec chmod 655 {} ;
Możemy też wyszukać katalogi z uprawnieniami 644 i zmienić je na 755.
find . -type d -perm 644
Wynik:
./docs
Katalog `docs` ma uprawnienia 644.
drwxrwxr-x 2 jack jack 4096 Jan 3 12:45 docs
Aby zmienić jego uprawnienia na 755:
find . -type d -perm 644 -exec chmod 755 {} ;
Możemy ponownie sprawdzić uprawnienia:
find . -type d -perm 755
Wynik:
. ./docs
Widzimy, że katalogi root i `docs` mają uprawnienia 755. Pełne szczegóły polecenia `ls -la`:
drwxr-xr-x 2 jack jack 4096 Jan 3 12:45 docs
Wyszukiwanie i kopiowanie plików lub katalogów
Aby znaleźć i skopiować konkretny plik do innego katalogu, np. do katalogu `~/tmp/images`:
find -iname file22.txt -exec cp {} ~/tmp/images ;
Aby wyszukać i skopiować wszystkie pliki danego typu (np. obrazy z rozszerzeniem `jpg`) do innego katalogu:
find -iname '*.jpg' -exec cp {} ~/tmp/images ;
Powyższe polecenie skopiuje wszystkie pliki `jpg` do folderu `~/tmp/images`.
Wyszukiwanie i kopiowanie jednego pliku do wielu katalogów
Aby znaleźć i skopiować plik do wielu katalogów:
find ~/tmp/dir1/ ~/tmp/dir2/ $HOME/3/ -maxdepth 0 -exec cp ~/numeric/hci {} ;
Powyższe polecenie znajdzie plik `hci` i skopiuje go do katalogów `/tmp/dir1/`, `/tmp/dir2/` i `$HOME/3/`.
Wyszukiwanie i przenoszenie plików do innego katalogu
Aby przenieść plik z jednego katalogu do innego, np. aby przenieść plik `universal.php`:
find ~/folder/ -type f -name universal.php -exec mv {} ~/numeric/ ;
Aby wyszukać i przenieść wszystkie pliki z danym rozszerzeniem do innego folderu:
find ~/numeric/ -type f -name '*.php' -exec mv {} ~/folder/ ;
Wyszukiwanie określonych plików i przenoszenie ich do innego folderu
find -type f -name uni*.* -exec mv {} ~/unifiles/ ;
Powyższe polecenie wyszuka pliki, których nazwa zaczyna się od `uni` i ma dowolne rozszerzenie, a następnie przeniesie je do katalogu `/unifiles/`.
Wyszukiwanie i przenoszenie plików na podstawie wieku
Aby przenieść pliki starsze niż określona liczba dni do innej lokalizacji, na przykład do archiwum:
find /ścieżka/ -type f -name '*.pdf' -mtime +20 -exec mv {} /backup1/ ;
Powyższe polecenie wyszuka pliki `pdf` starsze niż 20 dni i przeniesie je do katalogu `backup1`.
Wyszukiwanie i usuwanie plików i katalogów
Składnia polecenia `find` służąca do usuwania plików i katalogów w bieżącym katalogu:
Usuwanie tylko plików:
find . -type f -name "plik-do-usunięcia" -exec rm -f {} ;
Usuwanie tylko katalogów:
find . -type d -name "katalog-do-usunięcia" -exec rm -rf {} ;
Wyszukiwanie i usuwanie tylko określonych plików
Aby znaleźć i usunąć pliki, których nazwa zaczyna się od `til`:
find . -type f -name "til*" -exec rm {} ;
Aby znaleźć i usunąć katalogi, których nazwa zaczyna się od `til`:
find . -type d -name "til*" -exec rm {} ;
Usuwanie plików i katalogów o tej samej nazwie
find . -name "til*" -exec rm -rf {} ;
Powyższe polecenie usunie zarówno pliki, jak i katalogi, których nazwa zaczyna się od liter `til`.
Usuwanie plików według rozszerzenia
Poniżej przedstawiono sposób wyszukiwania i usuwania wszystkich plików tekstowych w bieżącym katalogu. Zastąp `txt` innym rozszerzeniem (np. `bak`, `pdf`), aby usunąć pliki innego typu.
find . -type f -name "*.txt" -exec rm -f {} ;
Jeśli chcesz, aby system przed usunięciem każdego pliku wyświetlał monit o potwierdzenie, dodaj opcję `-i`:
find . -type f -name "*.txt" -exec rm -i {} ;
Wynik:
rm: remove regular empty file './File22.txt'? y rm: remove regular empty file './file22.txt'? y rm: remove regular empty file './file23.txt'?
Domyślnie opcja `-rm` nie usuwa katalogów. Należy użyć opcji `-r`, aby zapewnić rekurencyjne usuwanie (usuwanie katalogów i plików w nich zawartych). Opcja `-f` wymusza usunięcie i jest używana zarówno dla plików, jak i katalogów.
Wyszukiwanie i usuwanie plików starszych niż N dni
Aby wyszukać i usunąć pliki kopii zapasowej starsze niż 20 dni z bieżącego katalogu:
find . -type f -name '*.bak' -mtime +20 -exec rm {} ;
Powyższe polecenie usunie wszystkie pliki `bak` starsze niż 20 dni.
Wyszukiwanie i usuwanie tylko katalogów
Aby usunąć katalog o nazwie `dir22`:
find . -type d -name dir22 -exec rm -rf {} ;
Upewnij się, że nazwa katalogu ma właściwą wielkość liter lub użyj opcji `-iname`.
find . -type d -iname Dir22 -exec rm -rf {} ;
Powyższe polecenie usunie zarówno `Dir22`, jak i `dir22`.
Aby potwierdzić przed usunięciem, użyj opcji `-i`:
find . -type d -iname Dir22 -exec rm -rf -i {} ;
Wynik:
rm: remove directory "./Dir22"? n rm: remove directory "./dir22"? y
W tym przypadku wpisaliśmy `n` dla katalogu `Dir22` (który nie zostanie usunięty) oraz `y` dla katalogu `dir22` (który zostanie usunięty).
Wyszukiwanie i usuwanie pustych plików
Można użyć dowolnego z poniższych poleceń, aby zlokalizować puste pliki i usunąć je automatycznie:
find ./ -type f -size 0 -exec rm -f {} ;
lub
find ./ -type f -size 0 | xargs rm -f
lub
find ./ -type f -size 0 -delete
Wyszukiwanie i usuwanie pustych katalogów
Aby usunąć puste katalogi, użyjemy opcji `d`:
find ./ -type d -empty -exec rmdir {} ;
Alternatywą jest użycie opcji `-delete` zamiast `-exec rmdir`:
find ./ -type d -empty -delete
Pamiętaj, że usuwanie plików systemowych lub innych ważnych elementów może uszkodzić system operacyjny lub aplikacje, a także prowadzić do utraty ważnych danych.
Aby uniknąć przypadkowego usunięcia niepotrzebnych elementów, korzystaj z konta użytkownika innego niż `root`. Upewnij się, że usuwasz tylko te pliki, które są niepotrzebne i masz kopię zapasową wszystkich ważnych danych.
Co dalej?
Zachęcamy do przetestowania powyższych poleceń `find` w środowisku testowym. Zobacz, czy uda Ci się wykorzystać niektóre z nich do zautomatyzowania procesu czyszczenia systemu plików za pomocą narzędzia `Crontab`. Jeśli chcesz zgłębić wiedzę na temat systemu Linux, sprawdź ten kurs online.
newsblog.pl
Maciej – redaktor, pasjonat technologii i samozwańczy pogromca błędów w systemie Windows. Zna Linuxa lepiej niż własną lodówkę, a kawa to jego główne źródło zasilania. Pisze, testuje, naprawia – i czasem nawet wyłącza i włącza ponownie. W wolnych chwilach udaje, że odpoczywa, ale i tak kończy z laptopem na kolanach.