Wprowadzenie
Jednym z problemów, z jakimi borykają się użytkownicy, gdy po raz pierwszy mają do czynienia z maszyną linuksową, jest znalezienie plików, których szukają.
W tym przewodniku omówimy, jak używać trafnie nazwanej komendy find
. To pomoże Ci szukać plików na swoim VPS przy użyciu różnych filtrów i parametrów. Pokrótce omówimy również polecenie locate
, które może być używane do wyszukiwania plików w inny sposób.
Wyszukiwanie według nazwy
Najbardziej oczywistym sposobem wyszukiwania plików jest wyszukiwanie według nazwy.
Aby znaleźć plik według nazwy, wpisz:
- find -name "query"
Będzie to uwzględniało wielkość liter, co oznacza, że wyszukiwanie dla file
jest inne niż wyszukiwanie dla File
.
Aby znaleźć plik według nazwy, ale zignorować wielkość liter w zapytaniu, wpisz:
- find -iname "query"
Jeśli chcesz znaleźć wszystkie pliki, które nie pasują do określonego wzorca, możesz odwrócić wyszukiwanie za pomocą -not
lub !
. Jeśli używasz !
, musisz uciec od znaku, aby bash nie próbował go interpretować zanim find będzie mógł działać:
- find -not -name "query_to_avoid"
Or
- find \! -name "query_to_avoid"
Szukanie według typu
Możesz określić typ plików, które chcesz znaleźć za pomocą parametru -type
. Działa to tak:
- find -type type_descriptor query
Kilka najczęstszych deskryptorów, których można użyć do określenia typu pliku, znajduje się tutaj:
-
f: plik zwykły
-
d: katalog
-
l: dowiązanie symboliczne
-
c: urządzenia znakowe
-
b: urządzenia blokowe
Na przykład, gdybyśmy chcieli znaleźć wszystkie urządzenia znakowe w naszym systemie, moglibyśmy wydać to polecenie:
- find / -type c
Output/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 wyszukać wszystkie pliki, które kończą się na .conf
w ten sposób:
- find / -type f -name "*.conf"
Output/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 daje wiele sposobów filtrowania wyników według rozmiaru i czasu.
Rozmiar
Możesz filtrować według rozmiaru za pomocą parametru -size
.
Dodajemy przyrostek na końcu naszej wartości, który określa sposób liczenia. Oto kilka popularnych opcji:
-
c: bajty
-
k: Kilobajty
-
M: Megabajty
-
G: Gigabajty
-
b: 512-bajtowe bloki
Aby znaleźć wszystkie pliki, które mają dokładnie 50 bajtów, wpisz:
- find / -size 50c
Aby znaleźć wszystkie pliki o rozmiarze mniejszym niż 50 bajtów, możemy zamiast tego użyć tej postaci:
- find / -size -50c
Aby znaleźć wszystkie pliki większe niż 700 megabajtów, możemy użyć tego polecenia:
- find / -size +700M
Czas
Linux przechowuje dane czasowe o czasach dostępu, czasach modyfikacji i czasach zmian.
-
Czas dostępu: Ostatni raz, kiedy plik został odczytany lub zapisany.
-
Czas modyfikacji: Ostatni raz, kiedy zawartość pliku została zmodyfikowana.
-
Change Time: Last time time the file’s inode meta-data was changed.
Możemy ich używać z parametrami -atime
, -mtime
i -ctime
. Mogą one używać symboli plus i minus, aby określić większe niż lub mniejsze niż, tak jak zrobiliśmy to z rozmiarem.
Wartość tego parametru określa, ile dni temu chcemy wyszukiwać.
Aby znaleźć pliki, które mają czas modyfikacji dzień temu, wpisz:
- find / -mtime 1
Jeśli chcemy pliki, które były dostępne w mniej niż dzień temu, możemy wpisać:
- find / -atime -1
Aby uzyskać pliki, które ostatnio miały zmienione meta informacje więcej niż 3 dni temu, wpisz:
- find / -ctime +3
Istnieją również pewne parametry towarzyszące, których możemy użyć, aby określić minuty zamiast dni:
- find / -mmin -1
W ten sposób otrzymamy pliki, które zostały zmodyfikowane typu system w ciągu ostatniej minuty.
Find może również wykonywać porównania z plikiem referencyjnym i zwracać te, które są nowsze:
- find / -newer myfile
Wyszukiwanie według właściciela i uprawnień
Możesz również wyszukiwać pliki według właściciela pliku lub właściciela grupy.
Robisz to używając odpowiednio parametrów -user
i -group
. Znajdź plik, który jest własnością użytkownika „syslog” wpisując:
- find / -user syslog
Podobnie, możemy określić pliki należące do grupy „shadow” wpisując:
- find / -group shadow
Możemy również wyszukiwać pliki z określonymi uprawnieniami.
Jeśli chcemy dopasować dokładny zestaw uprawnień, używamy tej postaci:
- find / -perm 644
To dopasuje pliki z dokładnie podanymi uprawnieniami.
Jeśli chcemy określić cokolwiek z co najmniej tymi uprawnieniami, możemy użyć tej postaci:
- find / -perm -644
To dopasuje wszystkie pliki, które mają dodatkowe uprawnienia. W tym przypadku dopasowany zostanie plik z uprawnieniami „744”.
Filtrowanie przez głębokość
W tej sekcji utworzymy strukturę katalogów w katalogu tymczasowym. Będzie ona zawierała trzy poziomy katalogów, z dziesięcioma katalogami na pierwszym poziomie. Każdy katalog (łącznie z katalogiem tymczasowym) będzie zawierał dziesięć plików i dziesięć podkatalogów.
Utwórz tę strukturę, wydając następujące polecenia:
- 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
Nie krępuj się sprawdzić struktury katalogów za pomocą ls
i cd
, aby zorientować się, jak wszystko jest zorganizowane. Kiedy skończysz, wróć do katalogu testowego:
- cd ~/test
Popracujemy nad tym, jak zwracać konkretne pliki z tej struktury. Dla porównania, spróbujmy przykładu ze zwykłym wyszukiwaniem nazw plików:
- find -name file1
Output./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. . .
Wyników jest bardzo dużo. Jeśli przeciągniemy wyjście do licznika, zobaczymy, że jest 1111 wyników:
- find -name file1 | wc -l
Output1111
Jest to prawdopodobnie zbyt wiele wyników, aby były przydatne w większości przypadków. Spróbujmy to zawęzić.
Możesz określić maksymalną głębokość wyszukiwania pod katalogiem najwyższego poziomu:
- find -maxdepth num -name query
Aby znaleźć „plik1” tylko w katalogach „poziomu1” i wyżej, możesz określić maksymalną głębokość 2 (1 dla katalogu najwyższego poziomu i 1 dla katalogów poziomu1):
- find -maxdepth 2 -name file1
Output./level1dir7/file1./level1dir1/file1./level1dir3/file1./level1dir8/file1./level1dir6/file1./file1./level1dir2/file1./level1dir9/file1./level1dir4/file1./level1dir5/file1./level1dir10/file1
To jest o wiele bardziej zarządzalna lista.
Możesz również określić minimalny katalog, jeśli wiesz, że wszystkie pliki istnieją po pewnym czasie pod bieżącym katalogiem:
- find -mindepth num -name query
Możemy użyć tego, aby znaleźć tylko pliki na końcu gałęzi katalogów:
- find -mindepth 4 -name file
Output./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. . .
Znowu, z powodu naszej rozgałęzionej struktury katalogów, zwróci to dużą liczbę wyników (1000).
Możesz połączyć parametry głębokości min i max, aby skupić się na wąskim zakresie:
- find -mindepth 2 -maxdepth 3 -name file
Output./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ń Znajdź
Możesz wykonać dowolne polecenie pomocnicze na wszystkim, co znajdzie, używając parametru -exec
. Jest to wywoływane w następujący sposób:
- find find_parameters -exec command_and_params {} \;
Parametr {}
jest używany jako placeholder dla plików, które znajdują dopasowania. Parametr \;
jest używany, aby find wiedział, gdzie kończy się polecenie.
Na przykład, możemy znaleźć pliki w poprzedniej sekcji, które miały uprawnienia 644
i zmodyfikować je tak, aby miały uprawnienia 664
:
- cd ~/test
- find . -type f -perm 644 -exec chmod 664 {} \;
Możemy wtedy zmienić uprawnienia do katalogów w ten sposób:
- find . -type d -perm 755 -exec chmod 700 {} \;
Jeśli chcesz połączyć różne wyniki, możesz użyć poleceń -and
lub -or
. Polecenie -and
jest przyjmowane, jeśli zostanie pominięte.
- find . -name file1 -or -name file9
Wyszukiwanie plików za pomocą polecenia Locate
Alternatywą dla użycia polecenia find
jest polecenie locate
. To polecenie jest często szybsze i może z łatwością przeszukać cały system plików.
Możesz zainstalować to polecenie na Debianie lub Ubuntu za pomocą apt
:
- sudo apt install mlocate
W systemie CentOS zamiast tego użyj dnf
:
- sudo dnf install mlocate
Powodem, dla którego locate
jest szybsze niż find
, jest to, że opiera się na bazie danych plików w systemie plików.
Baza danych jest zwykle aktualizowana raz dziennie za pomocą skryptu cron, ale możesz ją zaktualizować ręcznie, wpisując:
- sudo updatedb
Uruchom to polecenie teraz. Pamiętaj, że baza danych musi być zawsze aktualna, jeśli chcesz znaleźć ostatnio nabyte lub utworzone pliki.
Aby znaleźć pliki za pomocą locate, po prostu użyj tej składni:
- locate query
Możesz filtrować dane wyjściowe na kilka sposobów.
Na przykład, aby zwracać tylko pliki zawierające samo zapytanie, zamiast zwracać każdy plik zawierający zapytanie w katalogach prowadzących do niego, możesz użyć -b
do przeszukiwania tylko „nazwy podstawowej”:
- locate -b query
Aby locate zwracało tylko wyniki, które wciąż istnieją w systemie plików (nie zostały usunięte między ostatnim wywołaniem updatedb
a bieżącym locate
), użyj flagi -e
:
- locate -e query
Aby zobaczyć statystyki dotyczące informacji skatalogowanych przez locate, użyj opcji -S
:
- locate -S
OutputDatabase /var/lib/mlocate/mlocate.db:3,315 directories37,228 files1,504,439 bytes in file names594,851 bytes used to store database
Wnioski
Zarówno find, jak i locate są dobrymi sposobami wyszukiwania plików w systemie. Do ciebie należy decyzja, które z tych narzędzi jest odpowiednie w każdej sytuacji.
Find i locate są potężnymi poleceniami, które można wzmocnić, łącząc je z innymi narzędziami za pomocą potoków. Eksperymentuj z filtrowaniem, używając poleceń takich jak wc
, sort
i grep
.
.