Problem, z którym się spotykają użytkownicy przy pierwszym używaniu Linux — jak znaleźć potrzebny plik.
W tym artykule zostanie omówione wykorzystanie polecenia find
. Ono pomoże Ci szukać plików na Twoim serwerze VPS wykorzystując różne filtry i parametry. Zostanie przez nas też opisane polecenie locate
, które może być wykorzystywane do wyszukiwania komend w inny sposób.
Nasz artykuł o tym, jak zarządzać procesami w Linux: ps, kill i nice.
Wyszukiwanie według nazwy
Najbardziej oczywistym sposobem jest wyszukiwanie plików według ich nazwy.
Żeby znaleźć plik według nazwy, wpisz:
find -name "query"
Bardzo ważnym tu jest wielkość liter – wyniki dla „plik” i „Plik” będą różne.
Żeby znaleźć plik według nazwy, ignorując wielkość liter, wpisz:
find -iname "query"
Jeżeli chcesz znaleźć wszystkie pliki, które nie są powiązane z określoną wielkością literówek, możesz zacząć wyszukiwanie ze wpisywania „-not” lub „!”. Jeśli używasz „!”, musisz dodać “\”, żeby Linux nie przetłumaczył go przed tym, jak find zacznie działać:
find -not -name "query_to_avoid"
lub
find \! -name "query_to_avoid"
Wyszukiwanie według typu
Możesz określać typ pliku, który chcesz znaleźć za pomocą parametru „-type”. Działa on tak:
find -type type_descriptor query
Niektóre z najbardziej popularnych parametrów, których możesz używać dla określenia typu pliku:
- f: zwykły plik
- d: katalog
- l: link symboliczny
- c: urządzenia znakowe
- b: urządzenia blokowe
Na przykład, jeżeli chcemy znaleźć wszystkie urządzenia znakowe w naszym systemie, możemy wydać polecenie:
find / -type c
/dev/parport0
/dev/snd/seq
/dev/snd/timer
/dev/autofs
/dev/cpu/microcode
/dev/vcsa7
/dev/vcs7
/dev/vcsa6
/dev/vcs6
/dev/vcsa5
/dev/vcs5
/dev/vcsa4
. . .
Możemy szukać wszystkich plików, które się kończą na „.conf” tak:
find / -type f -name “*.conf”
/var/lib/ucf/cache/:etc:rsyslog.d:50-default.conf
/usr/share/base-files/nsswitch.conf
/usr/share/initramfs-tools/event-driven/upstart-jobs/mountall.conf
/usr/share/rsyslog/50-default.conf
/usr/share/adduser/adduser.conf
/usr/share/davfs2/davfs2.conf
/usr/share/debconf/debconf.conf
/usr/share/doc/apt-utils/examples/apt-ftparchive.conf
. . .
Filtrowanie według czasu i rozmiaru
Find oferuje mnóstwo sposobów filtrowania wyników za rozmiarem oraz czasem.
Rozmiar
Możesz filtrować według rozmiaru za pomocą parametru „-size”.
Na końcu wartości dodajemy sufiks, który konkretyzuje to, jak kalkulujemy. Niżej podano kilka najbardziej popularnych opcji:
- c: bajty
- k: kilobajty
- M: megabajty
- G: gigabajty
- b: 512-bajtowe bloki
Żeby znaleźć wszystkie pliki o wielkości 50 bajtów, wpisz:
find / -size 50c
Natomiast, żeby znaleźć wszystkie pliki o wielkości mniejszej 50 bajtów, możemy wykorzystać tą formę:
find / -size -50c
Żeby znaleźć wszystkie pliki większe od 700 megabajtów, możemy wykorzystać tą komendę:
find / -size +700M
Czas
System Linux przechowuje dane o czasie otwarcia, modyfikacji oraz zapisanych zmianach plików.
- Czas dostępu: kiedy ostatnio plik był przeczytany lub zapisany.
- Czas modyfikacji: kiedy ostatnio treść lub plik zostały modyfikowane.
- Czas zmiany: kiedy ostatnio meta-dane pliku były zmienione.
Możemy również wykorzystać te parametry: “-atime”, “-mtime”, i “-ctime”. Mogą one używać symbolów plusa lub minusa z celą doprecyzowania więcej niż, lub mniej niż – jak robiliśmy z rozmiarem.
Wartość tego parametru konkretyzuje, ile dni temu czegoś szukałeś.
Żeby znaleźć pliki z czasem modyfikacji 1 dzień temu, wpisz:
find / -mtime 1
Jeżeli szukamy plików, do których było uzyskano dostęp wcześniej, jak dzień temu, możemy wpisać:
find / -atime -1
Dla znalezienia plików ze zmienioną meta informacją więcej, jak 3 dni temu, wpisz:
find / -ctime +3
Jest też kilka podobnych parametrów, których możemy użyć dla określenia minut zamiast godzin:
find / -mmin -1
Zostaną znalezione pliki, które były modyfikowane w ostatnią minutę.
Find też może zrobić porównywania między plikiem głównym a nowszym, i wskazać który z nich jest nowszy:
find / -newer myfile
Wyszukiwanie według właścicieli oraz uprawnień
Też możesz szukać plików według właściciela pliku lub właściciela grupy.
Możesz to zrobić używając parametrów „-user” oraz „-group” odpowiednio. Znajdź plik we własności „syslog” wpisując:
find / -user syslog
Podobnie, możemy szukać pliki z grupy “szhadow”:
find / -group shadow
Możemy też szukać plików, które mają określone zezwolenia.
Jeżeli chcemy dopasować taki sam zestaw zezwoleń, wykorzystujemy formę:
find / -perm 644
Dzięki temu, dopasujemy pliki do konkretnych zezwoleń.
Jeżeli chcemy specyfikować cokolwiek za pomocą co najmniej tamtych zezwoleń, możemy użyć tej formy:
find / -perm -644
Tym krokiem dopasujesz pliki, które mają dodatkowe zezwolenie. Plik, który ma zezwolenia „744” zostanie wyświetlony w tym przypadku.
Filtrowanie według głębokości
W tej sekcji stworzymy strukturę katalogów w folderze tymczasowym. Będzie on zawierał trzy katalogi z dziesięcioma plikami na pierwszym poziomie. Każdy folder (w tym folder tymczasowy) będzie zawierał dziesięć plików i dziesięć podkatalogów.
Utwórz tą strukturę wpisując takie polecenie:
cd
mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
cd ~/test
Sprawdź strukturę katalogów za pomocą ls
i cd
, żeby zrozumieć, jakie pliki są i gdzie. Kiedy skończysz, wracaj do testowego katalogu:
cd ~/test
Będziemy pracować nad tym, żeby wyświetlić określone pliki ze struktury. Spróbujmy użyć przykładu ze zwykłą nazwą poszukiwania:
find -name file1
./level1dir7/level2dir8/level3dir9/file1
./level1dir7/level2dir8/level3dir3/file1
./level1dir7/level2dir8/level3dir4/file1
./level1dir7/level2dir8/level3dir1/file1
./level1dir7/level2dir8/level3dir8/file1
./level1dir7/level2dir8/level3dir7/file1
./level1dir7/level2dir8/level3dir2/file1
./level1dir7/level2dir8/level3dir6/file1
./level1dir7/level2dir8/level3dir5/file1
./level1dir7/level2dir8/file1
. . .
Jest dużo wyników. Jeśli podilczymy dane wyjściowe — zobaczymy, że jest 1111 wyników:
find -name file1 | wc -l
1111
Prawdopodobnie, jest to za dużo wyników do wykorzystania w większości przypadków. Spróbujmy teraz się zagłębić.
Możesz ukonkretnić maksymalną głębokość wyszukiwania pod głównym poziomem wyszukiwanego katalogu:
find -maxdepth num -name query
Żeby znaleźć „file1” tylko w katalogach „level1” i wyżej, możesz określić maksymalną głębokość 2 (1 – dla głównego poziomu katalogu, i 1 – dla level1 katalogów):
find -maxdepth 2 -name file1
./level1dir7/file1
./level1dir1/file1
./level1dir3/file1
./level1dir8/file1
./level1dir6/file1
./file1
./level1dir2/file1
./level1dir9/file1
./level1dir4/file1
./level1dir5/file1
./level1dir10/file1
I to jest lista, z którą już dasz radę coś znaleźć.
Też możesz podać minimalny katalog, jeżeli wiesz, że wszystkie pliki istnieją po pewnym momencie pod bieżącym katalogiem:
find -mindepth num -name query
Możemy wykorzystać tą metodę dla znalezienia tylko takich plików, które się znajdują na końcu gałęzi katalogów:
find -mindepth 4 -name file
./level1dir7/level2dir8/level3dir9/file1
./level1dir7/level2dir8/level3dir3/file1
./level1dir7/level2dir8/level3dir4/file1
./level1dir7/level2dir8/level3dir1/file1
./level1dir7/level2dir8/level3dir8/file1
./level1dir7/level2dir8/level3dir7/file1
./level1dir7/level2dir8/level3dir2/file1
. . .
Znów, przez naszą gałęziową strukturę katalogów dostaniemy dużą ilość wyników (1000).
Możesz łączyć minimalne i maksymalne parametry, żeby skupić się na wąskim zakresie:
find -mindepth 2 -maxdepth 3 -name file
./level1dir7/level2dir8/file1
./level1dir7/level2dir5/file1
./level1dir7/level2dir7/file1
./level1dir7/level2dir2/file1
./level1dir7/level2dir10/file1
./level1dir7/level2dir6/file1
./level1dir7/level2dir3/file1
./level1dir7/level2dir4/file1
./level1dir7/file1
. . .
Wykonywanie i łączenie poleceń Find
Możesz wykonać to polecenie na wszystkim, co find
może znaleźć za pomocą parametru „-exec”. Wygląda to tak:
find find_parameters -exec command_and_params {} \;
„{}” jest wykorzystywany jako symbol zastępczy dla plików, które find
może odnaleźć. „\;” jest wykorzystywany po to, żeby find
wiedział, gdzie polecenie się kończy.
Na przykład, moglibyśmy znaleźć pliki w poprzedniej sekcji, które miałyby uprawnienia „644” i zmodyfikować uprawnienia na „664”:
cd ~/test
find . -type f -perm 644 -exec chmod 664 {} \;
Moglibyśmy wtedy zmienić uprawnienia dla folderu tak:
find . -type d -perm 755 -exec chmod 700 {} \;
Jeśli chcesz powiązać różne wyniki, możesz użyć atrybutów “-and” lub “-or”. “-and” się przyjmuje, nawet jeżeli została pominięta.
find . -name file1 -or -name file9
Wyszukiwanie plików za pomocą locate
Alternatywą dla wykorzystywania find
jest funkcja locate
. Ta komenda jest szybsza i może łatwo szukać plików przez cały system.
Możesz zainstalować tą funkcję za pomocą apt-get:
sudo apt-get update
sudo apt-get install mlocate
Przyczyną tego, że locate jest szybszy od find’a jest to, że on (locate) opiera się na bazę danych plików w systemie plików.
Baza danych zazwyczaj aktualizuje się raz dziennie za pomocą cron, ale można zaktualizować ją ręcznie, wpisując:
sudo updatedb
Uruchom to polecenie teraz. Pamiętaj, że baza danych zawsze musi być aktualizowana, jeśli chcesz znaleźć świeżo pobrane lub stworzone pliki.
Żeby znaleźć pliki za pomocą locate, po prostu użyj tej składni:
locate query
Możesz filtrować wyniki w kilka sposobów.
Na przykład, żeby otrzymać tylko pliki, które zawierają “query”, zamiast tego, żeby sprawdzać i wyświetlać każdy plik, który ma “query” w odpowiednich katalogach, które do niego prowadzą, możesz użyć parametr „-b” dla wyszukiwania tylko według nazwy bazowej:
locate -b query
Żeby otrzymać wyniki, które jeszcze istnieją w systemie plików (które nie zostały usunięte między ostatnim połączeniem „updatedb” i bieżącym połączeniem „locate”), użyj flagi „-e”:
locate -e query
Żeby zobaczyć statystyki wykorzystania dla informacji, którą locate przechowuje użyj opcji „-S”:
locate -S
Database /var/lib/mlocate/mlocate.db:
3,315 directories
37,228 files
1,504,439 bytes in file names
594,851 bytes used to store database
Wnioski
Find i locate są dobrymi sposobami wyszukiwania plików w systemie operacyjnym. Wszystko zależy od wyboru instrumentu, który będzie stosowany w określonej sytuacji.
Find i locate – potężne funkcje, które mogą być wzmocnione ich połączeniem z innym oprogramowaniem. Eksperymentuj z filtrowaniem używając takich poleceń jak wc
, sort
i grep
.