Jak używać funkcji Znajdź i Zlokalizuj do wyszukiwania plików w systemie Linux

author
9 minutes, 4 seconds Read

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
Output
1111

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
Output
Database /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.

.

Similar Posts

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.