Како да користите Најдете и лоцирајте за да пребарувате датотеки на Linux


Вовед

Еден проблем со кој корисниците наидуваат при првото учење како да работат со Linux е како да ги најдат датотеките што ги бараат.

Овој водич ќе опфати како да се користи соодветно именуваната команда find. Ова ќе ви помогне да пребарувате датотеки на вашиот систем користејќи различни филтри и параметри. Исто така, накратко ќе ја опфати командата locate, која може да се користи за пребарување на датотеки на поинаков начин.

Предуслови

За да го следите ова упатство, ќе ви треба пристап до компјутер со оперативен систем базиран на Линукс. Ова може да биде или виртуелен приватен сервер на кој сте се поврзале со SSH или со вашата локална машина. Забележете дека ова упатство беше потврдено со користење на сервер за Линукс со Ubuntu 20.04, но дадените примери треба да работат на компјутер што работи на која било верзија на која било дистрибуција на Линукс.

Ако планирате да користите далечински сервер за да го следите ова упатство, ве охрабруваме прво да го комплетирате нашето упатство за почетно поставување сервер. Со тоа ќе поставите безбедно опкружување на серверот - вклучувајќи корисник кој не еroot со привилегии sudo и заштитен ѕид конфигуриран со UFW - што можете да го користите за да го изградите вашиот Linux вештини.

Забелешка: за да се илустрира како функционираат командите find и locate, примерите наредби во овој водич бараат датотеки складирани под / или root директориум. Поради ова, ако сте најавени на терминалот како корисник кој не еroot, некои од примерите наредби може да вклучуваат Дозволата е одбиена во нивниот излез.

Ова треба да се очекува, бидејќи барате датотеки во директориуми до кои обичните корисници обично немаат пристап. Сепак, овие примери на команди сепак треба да работат и да бидат корисни за разбирање како функционираат овие програми.

Наоѓање по име

Најочигледен начин за пребарување на датотеки е според нивното име.

За да пронајдете датотека по име со командата find, би ја користеле следнава синтакса:

  1. find -name "query"

Ова ќе биде чувствително на букви, што значи дека пребарувањето за query се разликува од пребарувањето за Query.

За да пронајдете датотека по име, но да го игнорирате случајот на барањето, користете ја опцијата -iname:

  1. find -iname "query"

Ако сакате да ги најдете сите датотеки што не се придржуваат до одредена шема, можете да го превртите пребарувањето со -not:

  1. find -not -name "query_to_avoid"

Алтернативно, можете да го превртите пребарувањето користејќи извичник (!), вака:

  1. find \! -name "query_to_avoid"

Имајте предвид дека ако користите !, мора да избегате од знакот со обратна коса црта (\) за да не се обиде школката да го протолкува пред find може да дејствува.

Наоѓање по тип

Можете да го одредите типот на датотеки што сакате да ги најдете со параметарот -type. Работи вака:

  1. find -type type_descriptor query

Еве некои од дескрипторите што можете да ги користите за да го одредите типот на датотеката:

  • f: обична датотека
  • d: директориум
  • l: симболична врска
  • c: уреди со знаци
  • b: блокирајте уреди

На пример, ако сакате да ги најдете сите уреди со знаци на вашиот систем, можете да ја издадете оваа команда:

  1. 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:

  1. 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 се подразбира секогаш кога ќе вклучите два израза. Можете исто така да вратите резултати што ги задоволуваат илиот изрази со нивно одвојување со опцијата -или:

  1. find -name query_1 -or -name query_2

Овој пример ќе ги пронајде сите датотеки чии имиња се совпаѓаат со query_1 или query_2.

Филтрирање по време и големина

find ви дава различни начини за филтрирање на резултатите по големина и време.

Големина

Можете да ги филтрирате датотеките според нивната големина користејќи го параметарот -size. За да го направите ова, мора да додадете специјална наставка на крајот на вредноста на нумеричката големина за да покажете дали ја броите големината во однос на бајти, мегабајти, гигабајти или друга големина. Еве неколку најчесто користени наставки за големина:

  • c: бајти
  • k: килобајти
  • М: мегабајти
  • Г: гигабајти
  • b: блокови од 512 бајти

За илустрација, следнава команда ќе ја пронајде секоја датотека во директориумот /usr што е точно 50 бајти:

  1. find /usr -size 50c

За да најдете датотеки што се помали од 50 бајти, наместо тоа, можете да ја користите оваа синтакса:

  1. find /usr -size -50c

За да најдете датотеки во директориумот /usr кои се повеќе од 700 мегабајти, можете да ја користите оваа команда:

  1. find /usr -size +700M

Време

За секоја датотека на системот, Linux складира временски податоци за времето на пристап, времето на модификација и времето на промена.

  • Време за пристап: последен пат кога датотеката била прочитана или напишана.
  • Време на измена: Последен пат кога содржината на датотеката беше изменета.
  • Време на промена: Последен пат кога беа променети метаподатоците на инод на датотеката.

Можете да ги базирате вашите пребарувања find на овие параметри користејќи ги опциите -atime, -mtime и -ctime, соодветно. За која било од овие опции, мора да поминете вредност што покажува колку дена во минатото сакате да пребарувате. Слично на опциите за големина наведени претходно, можете да ги поставите овие опции со симболите плус или минус за да наведете \поголемо од или \помалку од.

На пример, за да пронајдете датотеки во директориумот /usr кои беа изменети во последниот ден, извршете ја следнава команда:

  1. find /usr -mtime 1

Ако сакате датотеки до кои е пристапено пред помалку од еден ден, можете да ја извршите оваа команда:

  1. find /usr -atime -1

За да најдете датотеки на кои последен пат им се смениле мета информациите пред повеќе од 3 дена, може да го извршите следново:

  1. find /usr -ctime +3

Овие опции имаат и придружни параметри што можете да ги користите за да одредите минути наместо денови:

  1. find /usr -mmin -1

Ова ќе ги даде датотеките што се изменети во последната минута.

find исто така може да прави споредби со референтна датотека и да ги врати оние што се поновите:

  1. find / -newer reference_file

Оваа синтакса ќе ја врати секоја датотека на системот што е креирана или променета неодамна од референтната датотека.

Наоѓање по сопственик и дозволи

Можете исто така да пребарувате датотеки од корисникот или групата што ја поседува датотеката користејќи ги параметрите -user и -group, соодветно. За да ја пронајдете секоја датотека во директориумот /var што е во сопственост на корисникот syslog, извршете ја оваа команда:

  1. find /var -user syslog

Слично, можете да наведете датотеки во директориумот /etc во сопственост на групата shadow со внесување:

  1. find /etc -group shadow

Можете исто така да пребарувате датотеки со специфични дозволи.

Ако сакате да одговарате на точно збир на дозволи, можете да ја користите оваа синтакса која ги одредува дозволите користејќи октална нотација:

  1. find / -perm 644

Ова ќе одговара на датотеките со точно наведените дозволи.

Ако сакате да наведете нешто со барем тие дозволи, можете да претходите на ознаката за дозволи со знак минус:

  1. find / -perm -644

Ова ќе одговара на сите датотеки што имаат дополнителни дозволи. Датотека со дозволи од 744 ќе се совпадне во овој пример.

Филтрирање по длабочина

Во овој дел, ќе креирате пример структура на директориум што потоа ќе ја користите за да ги истражите датотеките за филтрирање според нивната длабочина во структурата.

Ако ги следите примерите во ова упатство, би било разумно да ги креирате овие датотеки и директориуми во директориумот /tmp/. /tmp/ е привремен директориум, што значи дека сите датотеки и директориуми во него ќе бидат избришани следниот пат кога серверот ќе се подигне. Ова ќе биде корисно за целите на овој водич, бидејќи можете да креирате онолку директориуми, датотеки и врски колку што сакате, без да се грижите дека подоцна ќе го затнат вашиот систем.

Откако ќе ги извршите командите во овој дел, вашиот директориум /tmp/ ќе содржи три нивоа директориуми, со десет директориуми на првото ниво. Секој директориум (вклучувајќи го и привремениот директориум) ќе содржи десет датотеки и десет поддиректориуми.

Направете пример структура на директориум во директориумот /tmp/ со следнава команда:

  1. mkdir -p /tmp/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}

После тоа, пополнете ги овие директориуми со некои примероци на датотеки користејќи ја командата touch:

  1. 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/ што штотуку го создадовте:

  1. cd /tmp/test

За да добиете основно разбирање за тоа како find ќе ги презема датотеките од оваа структура, започнете со редовно пребарување на имиња што се совпаѓа со која било датотека со име file1:

  1. 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:

  1. find -name file1 | wc -l
Output
1111

Ова е веројатно премногу резултати за да ви биде корисно во повеќето околности. За да го стесните, можете да ја одредите максималната длабочина на пребарувањето во директориумот за пребарување на највисоко ниво:

  1. find -maxdepth num -name query

За да најдете file1 само во директориумите level1 и погоре, можете да наведете максимална длабочина од 2 (1 за директориумот од највисоко ниво и 1 за level1 директориуми ):

  1. 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

Тоа е многу повеќе податлив список.

Можете исто така да наведете минимален директориум ако знаете дека сите датотеки постојат по одредена точка под тековниот директориум:

  1. find -mindepth num -name query

Можете да го користите ова за да ги најдете само датотеките на крајот од гранките на директориумот:

  1. 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).

Можете да ги комбинирате параметрите за минимална и максимална длабочина за да се фокусирате на тесен опсег:

  1. 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 користејќи ја следнава синтакса:

  1. find find_parameters -exec command_and_options {} \;

{} се користи како место за задржување за датотеките што се совпаѓаат со find. На \; му овозможува на find да знае каде завршува командата.

На пример, под претпоставка дека сè уште сте во директориумот test/ што го создадовте во директориумот /tmp/ во претходниот чекор, можете да ги најдете датотеките во претходниот дел што имаше дозволи за 644 и изменете ги за да имаат дозволи за 664:

  1. find . -type f -perm 644 -exec chmod 664 {} \;

Можете исто така да ги промените дозволите за директориумот на сличен начин:

  1. find . -type d -perm 755 -exec chmod 700 {} \;

Овој пример го наоѓа секој директориум со дозволи поставени на 755 и потоа ги менува дозволите на 700.

Наоѓање датотеки со користење на лоцирање

Алтернатива за користење на find е командата locate. Оваа команда е често побрза и може лесно да го пребарува целиот датотечен систем.

Можете да ја инсталирате командата на Debian или Ubuntu со apt со ажурирање на списоците на вашите пакети и потоа инсталирање на пакетот mlocate:

  1. sudo apt update
  2. sudo apt install mlocate

На Rocky Linux, CentOS и други дистрибуции добиени од RedHat, наместо тоа, можете да ја користите командата dnf за да инсталирате mlocate:

  1. sudo dnf install mlocate

Причината зошто locate е побрзо од find е затоа што се потпира на база на податоци што ги наведува сите датотеки на датотечниот систем. Оваа база на податоци обично се ажурира еднаш дневно со cron скрипта, но можете да ја ажурирате рачно со командата updatedb. Извршете ја оваа команда сега со привилегии sudo:

  1. sudo updatedb

Запомнете, базата на податоци locate мора секогаш да биде ажурирана ако сакате да најдете нови датотеки. Ако додадете нови датотеки пред да се изврши скриптата за cron или пред да ја извршите командата updatedb, тие нема да се појават во резултатите од вашето барање.

locate ви овозможува да ги филтрирате резултатите на повеќе начини. Најосновниот начин на кој можете да го користите за да пронајдете датотеки е да ја користите оваа синтакса:

  1. locate query

Ова ќе одговара на сите датотеки и директориуми што го содржат низата прашање каде било во патеката на нивната датотека. За да вратите само датотеки чии имиња го содржат самото барање, наместо секоја датотека што го има барањето во директориумите што водат до него, можете да го вклучите знамето -b за да пребарувате само датотеки чие \основно име ” се совпаѓа со барањето:

  1. locate -b query

За да имате locate враќајте само резултати што сè уште постојат во датотечниот систем (што значи датотеки што не биле отстранети помеѓу последниот повик updatedb и тековниот повик locate ), користете го знамето -e:

  1. locate -e query

Можете да вратите статистика за информациите што ги има каталогизирано locate користејќи ја опцијата -S:

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