Како да користите Најдете и лоцирајте за да пребарувате датотеки на Linux
Вовед
Еден проблем со кој корисниците наидуваат при првото учење како да работат со Linux е како да ги најдат датотеките што ги бараат.
Овој водич ќе опфати како да се користи соодветно именуваната команда find
. Ова ќе ви помогне да пребарувате датотеки на вашиот систем користејќи различни филтри и параметри. Исто така, накратко ќе ја опфати командата locate
, која може да се користи за пребарување на датотеки на поинаков начин.
Предуслови
За да го следите ова упатство, ќе ви треба пристап до компјутер со оперативен систем базиран на Линукс. Ова може да биде или виртуелен приватен сервер на кој сте се поврзале со SSH или со вашата локална машина. Забележете дека ова упатство беше потврдено со користење на сервер за Линукс со Ubuntu 20.04, но дадените примери треба да работат на компјутер што работи на која било верзија на која било дистрибуција на Линукс.
Ако планирате да користите далечински сервер за да го следите ова упатство, ве охрабруваме прво да го комплетирате нашето упатство за почетно поставување сервер. Со тоа ќе поставите безбедно опкружување на серверот - вклучувајќи корисник кој не еroot со привилегии sudo
и заштитен ѕид конфигуриран со UFW - што можете да го користите за да го изградите вашиот Linux вештини.
Забелешка: за да се илустрира како функционираат командите find
и locate
, примерите наредби во овој водич бараат датотеки складирани под /
или root директориум. Поради ова, ако сте најавени на терминалот како корисник кој не еroot, некои од примерите наредби може да вклучуваат Дозволата е одбиена
во нивниот излез.
Ова треба да се очекува, бидејќи барате датотеки во директориуми до кои обичните корисници обично немаат пристап. Сепак, овие примери на команди сепак треба да работат и да бидат корисни за разбирање како функционираат овие програми.
Наоѓање по име
Најочигледен начин за пребарување на датотеки е според нивното име.
За да пронајдете датотека по име со командата find
, би ја користеле следнава синтакса:
- find -name "query"
Ова ќе биде чувствително на букви, што значи дека пребарувањето за query
се разликува од пребарувањето за Query
.
За да пронајдете датотека по име, но да го игнорирате случајот на барањето, користете ја опцијата -iname
:
- find -iname "query"
Ако сакате да ги најдете сите датотеки што не се придржуваат до одредена шема, можете да го превртите пребарувањето со -not
:
- find -not -name "query_to_avoid"
Алтернативно, можете да го превртите пребарувањето користејќи извичник (!
), вака:
- find \! -name "query_to_avoid"
Имајте предвид дека ако користите !
, мора да избегате од знакот со обратна коса црта (\
) за да не се обиде школката да го протолкува пред find
може да дејствува.
Наоѓање по тип
Можете да го одредите типот на датотеки што сакате да ги најдете со параметарот -type
. Работи вака:
- find -type type_descriptor query
Еве некои од дескрипторите што можете да ги користите за да го одредите типот на датотеката:
f
: обична датотекаd
: директориумl
: симболична врскаc
: уреди со знациb
: блокирајте уреди
На пример, ако сакате да ги најдете сите уреди со знаци на вашиот систем, можете да ја издадете оваа команда:
- find /dev -type c
Оваа команда конкретно бара уреди само во директориумот /dev
, директориумот каде датотеките на уредот обично се монтираат во системите на Linux:
Output/dev/vcsa5
/dev/vcsu5
/dev/vcs5
/dev/vcsa4
/dev/vcsu4
/dev/vcs4
/dev/vcsa3
/dev/vcsu3
/dev/vcs3
/dev/vcsa2
/dev/vcsu2
/dev/vcs2
. . .
Можете да ги пребарувате сите датотеки што завршуваат на .conf
со команда како следнава. Овој пример бара соодветни датотеки во директориумот /usr
:
- find /usr -type f -name "*.conf"
Output/usr/src/linux-headers-5.4.0-88-generic/include/config/auto.conf
/usr/src/linux-headers-5.4.0-88-generic/include/config/tristate.conf
/usr/src/linux-headers-5.4.0-90-generic/include/config/auto.conf
/usr/src/linux-headers-5.4.0-90-generic/include/config/tristate.conf
/usr/share/adduser/adduser.conf
/usr/share/ufw/ufw.conf
/usr/share/popularity-contest/default.conf
/usr/share/byobu/keybindings/tmux-screen-keys.conf
/usr/share/libc-bin/nsswitch.conf
/usr/share/rsyslog/50-default.conf
. . .
Забелешка: претходниот пример комбинира два изрази за барање find
; имено, -type f
и -име „*.conf“
. За која било датотека да се врати, таа мора да ги задоволува двата од овие изрази.
Можете да комбинирате вакви изрази со нивно раздвојување со опцијата -and
, но како што покажува овој пример, -and
се подразбира секогаш кога ќе вклучите два израза. Можете исто така да вратите резултати што ги задоволуваат илиот изрази со нивно одвојување со опцијата -или:
- find -name query_1 -or -name query_2
Овој пример ќе ги пронајде сите датотеки чии имиња се совпаѓаат со query_1
или query_2
.
Филтрирање по време и големина
find
ви дава различни начини за филтрирање на резултатите по големина и време.
Големина
Можете да ги филтрирате датотеките според нивната големина користејќи го параметарот -size
. За да го направите ова, мора да додадете специјална наставка на крајот на вредноста на нумеричката големина за да покажете дали ја броите големината во однос на бајти, мегабајти, гигабајти или друга големина. Еве неколку најчесто користени наставки за големина:
c
: бајтиk
: килобајтиМ
: мегабајтиГ
: гигабајтиb
: блокови од 512 бајти
За илустрација, следнава команда ќе ја пронајде секоја датотека во директориумот /usr
што е точно 50 бајти:
- find /usr -size 50c
За да најдете датотеки што се помали од 50 бајти, наместо тоа, можете да ја користите оваа синтакса:
- find /usr -size -50c
За да најдете датотеки во директориумот /usr
кои се повеќе од 700 мегабајти, можете да ја користите оваа команда:
- find /usr -size +700M
Време
За секоја датотека на системот, Linux складира временски податоци за времето на пристап, времето на модификација и времето на промена.
- Време за пристап: последен пат кога датотеката била прочитана или напишана.
- Време на измена: Последен пат кога содржината на датотеката беше изменета.
- Време на промена: Последен пат кога беа променети метаподатоците на инод на датотеката.
Можете да ги базирате вашите пребарувања find
на овие параметри користејќи ги опциите -atime
, -mtime
и -ctime
, соодветно. За која било од овие опции, мора да поминете вредност што покажува колку дена во минатото сакате да пребарувате. Слично на опциите за големина наведени претходно, можете да ги поставите овие опции со симболите плус или минус за да наведете \поголемо од или \помалку од.
На пример, за да пронајдете датотеки во директориумот /usr
кои беа изменети во последниот ден, извршете ја следнава команда:
- find /usr -mtime 1
Ако сакате датотеки до кои е пристапено пред помалку од еден ден, можете да ја извршите оваа команда:
- find /usr -atime -1
За да најдете датотеки на кои последен пат им се смениле мета информациите пред повеќе од 3 дена, може да го извршите следново:
- find /usr -ctime +3
Овие опции имаат и придружни параметри што можете да ги користите за да одредите минути наместо денови:
- find /usr -mmin -1
Ова ќе ги даде датотеките што се изменети во последната минута.
find
исто така може да прави споредби со референтна датотека и да ги врати оние што се поновите:
- find / -newer reference_file
Оваа синтакса ќе ја врати секоја датотека на системот што е креирана или променета неодамна од референтната датотека.
Наоѓање по сопственик и дозволи
Можете исто така да пребарувате датотеки од корисникот или групата што ја поседува датотеката користејќи ги параметрите -user
и -group
, соодветно. За да ја пронајдете секоја датотека во директориумот /var
што е во сопственост на корисникот syslog, извршете ја оваа команда:
- find /var -user syslog
Слично, можете да наведете датотеки во директориумот /etc
во сопственост на групата shadow со внесување:
- find /etc -group shadow
Можете исто така да пребарувате датотеки со специфични дозволи.
Ако сакате да одговарате на точно збир на дозволи, можете да ја користите оваа синтакса која ги одредува дозволите користејќи октална нотација:
- find / -perm 644
Ова ќе одговара на датотеките со точно наведените дозволи.
Ако сакате да наведете нешто со барем тие дозволи, можете да претходите на ознаката за дозволи со знак минус:
- find / -perm -644
Ова ќе одговара на сите датотеки што имаат дополнителни дозволи. Датотека со дозволи од 744
ќе се совпадне во овој пример.
Филтрирање по длабочина
Во овој дел, ќе креирате пример структура на директориум што потоа ќе ја користите за да ги истражите датотеките за филтрирање според нивната длабочина во структурата.
Ако ги следите примерите во ова упатство, би било разумно да ги креирате овие датотеки и директориуми во директориумот /tmp/
. /tmp/
е привремен директориум, што значи дека сите датотеки и директориуми во него ќе бидат избришани следниот пат кога серверот ќе се подигне. Ова ќе биде корисно за целите на овој водич, бидејќи можете да креирате онолку директориуми, датотеки и врски колку што сакате, без да се грижите дека подоцна ќе го затнат вашиот систем.
Откако ќе ги извршите командите во овој дел, вашиот директориум /tmp/
ќе содржи три нивоа директориуми, со десет директориуми на првото ниво. Секој директориум (вклучувајќи го и привремениот директориум) ќе содржи десет датотеки и десет поддиректориуми.
Направете пример структура на директориум во директориумот /tmp/
со следнава команда:
- mkdir -p /tmp/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
После тоа, пополнете ги овие директориуми со некои примероци на датотеки користејќи ја командата touch
:
- touch /tmp/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
Со овие датотеки и директориуми на место, одете напред и одете во директориумот test/
што штотуку го создадовте:
- cd /tmp/test
За да добиете основно разбирање за тоа како find
ќе ги презема датотеките од оваа структура, започнете со редовно пребарување на имиња што се совпаѓа со која било датотека со име file1
:
- 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
. . .
Ова ќе врати многу резултати. Ако го внесете излезот во бројач, ќе откриете дека има вкупни резултати 1111
:
- find -name file1 | wc -l
Output1111
Ова е веројатно премногу резултати за да ви биде корисно во повеќето околности. За да го стесните, можете да ја одредите максималната длабочина на пребарувањето во директориумот за пребарување на највисоко ниво:
- find -maxdepth num -name query
За да најдете file1
само во директориумите level1
и погоре, можете да наведете максимална длабочина од 2 (1 за директориумот од највисоко ниво и 1 за level1 директориуми
):
- 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
Тоа е многу повеќе податлив список.
Можете исто така да наведете минимален директориум ако знаете дека сите датотеки постојат по одредена точка под тековниот директориум:
- find -mindepth num -name query
Можете да го користите ова за да ги најдете само датотеките на крајот од гранките на директориумот:
- find -mindepth 4 -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
. . .
Повторно, поради структурата на директориумот за разгранување, ова ќе врати голем број резултати (1000).
Можете да ги комбинирате параметрите за минимална и максимална длабочина за да се фокусирате на тесен опсег:
- find -mindepth 2 -maxdepth 3 -name file1
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
. . .
Комбинирањето на овие опции значително ги намалува резултатите, со само 110 вратени линии наместо претходните 1000.
Извршување на команди за наоѓање резултати
Може да извршите произволна помошна команда на сè што се совпаѓа со find
со користење на параметарот -exec
користејќи ја следнава синтакса:
- find find_parameters -exec command_and_options {} \;
{}
се користи како место за задржување за датотеките што се совпаѓаат со find
. На \;
му овозможува на find
да знае каде завршува командата.
На пример, под претпоставка дека сè уште сте во директориумот test/
што го создадовте во директориумот /tmp/
во претходниот чекор, можете да ги најдете датотеките во претходниот дел што имаше дозволи за 644
и изменете ги за да имаат дозволи за 664
:
- find . -type f -perm 644 -exec chmod 664 {} \;
Можете исто така да ги промените дозволите за директориумот на сличен начин:
- find . -type d -perm 755 -exec chmod 700 {} \;
Овој пример го наоѓа секој директориум со дозволи поставени на 755
и потоа ги менува дозволите на 700
.
Наоѓање датотеки со користење на лоцирање
Алтернатива за користење на find
е командата locate
. Оваа команда е често побрза и може лесно да го пребарува целиот датотечен систем.
Можете да ја инсталирате командата на Debian или Ubuntu со apt
со ажурирање на списоците на вашите пакети и потоа инсталирање на пакетот mlocate
:
- sudo apt update
- sudo apt install mlocate
На Rocky Linux, CentOS и други дистрибуции добиени од RedHat, наместо тоа, можете да ја користите командата dnf
за да инсталирате mlocate
:
- sudo dnf install mlocate
Причината зошто locate
е побрзо од find
е затоа што се потпира на база на податоци што ги наведува сите датотеки на датотечниот систем. Оваа база на податоци обично се ажурира еднаш дневно со cron скрипта, но можете да ја ажурирате рачно со командата updatedb
. Извршете ја оваа команда сега со привилегии sudo
:
- sudo updatedb
Запомнете, базата на податоци locate
мора секогаш да биде ажурирана ако сакате да најдете нови датотеки. Ако додадете нови датотеки пред да се изврши скриптата за cron или пред да ја извршите командата updatedb
, тие нема да се појават во резултатите од вашето барање.
locate
ви овозможува да ги филтрирате резултатите на повеќе начини. Најосновниот начин на кој можете да го користите за да пронајдете датотеки е да ја користите оваа синтакса:
- locate query
Ова ќе одговара на сите датотеки и директориуми што го содржат низата прашање
каде било во патеката на нивната датотека. За да вратите само датотеки чии имиња го содржат самото барање, наместо секоја датотека што го има барањето во директориумите што водат до него, можете да го вклучите знамето -b
за да пребарувате само датотеки чие \основно име ” се совпаѓа со барањето:
- locate -b query
За да имате locate
враќајте само резултати што сè уште постојат во датотечниот систем (што значи датотеки што не биле отстранети помеѓу последниот повик updatedb
и тековниот повик locate
), користете го знамето -e
:
- locate -e query
Можете да вратите статистика за информациите што ги има каталогизирано locate
користејќи ја опцијата -S
:
- locate -S
OutputDatabase /var/lib/mlocate/mlocate.db:
21015 directories
136787 files
7727763 bytes in file names
3264413 bytes used to store database
Ова може да биде корисно за разбирање на високо ниво за тоа колку датотеки и директориуми постојат на вашиот систем.
Заклучок
И командите find
и locate
се корисни алатки за наоѓање датотеки на вашиот систем. И двете се моќни команди што може да се зајакнат со нивно комбинирање со други комунални услуги преку цевководи, но на вас е да одлучите која алатка е соодветна за вашата дадена ситуација.
Оттука, ве охрабруваме да продолжите да експериментирате со find
и locate
. Можете да ги прочитате нивните соодветни страници man
за да дознаете за други опции кои не се опфатени во ова упатство, и можете да ги анализирате и манипулирате резултатите од пребарувањето со нивно цевки во други команди како wc
, сортирање
и grep
.