13 lip

Wyszukiwanie plików na Linux VPS za pomocą Find i Locate

Wyszukiwanie plików na Linux za pomocą find, locate

Wstęp

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.

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.

Udostępnij