Команда find (јуникс)

Из Википедије, слободне енциклопедије
(преусмерено са Команда find (Unix))
Иди на навигацију Иди на претрагу
find
Оригинални аутор(и)Dick Haight
Програмер(и)Белове лабораторије
Оперативни системЈуникс
ТипНаредба (програмирање)

У оперативним системима сличним Јуниксу, команда find је команда која се користи у командној линији (терминалу) којом се претражује једна или више грана фајл система. Лоцирање фајлова на неком критеријум корисника. Овом наредном се могу могу извршити и неке задате корисничке акције над фајловима који испуњавају задати критеријум. Неки од могућих критеријума јесу поклапање по неком датом шаблону, или временско поклапање по времену поседње промене, или последњег приступа. Стандардно, уколико се на зада другачије, команда find враћа листу фајлова испод тренутне гране радног директоријума.

Сродна наредба locate користи базу података и индексирање фајлова добијених наредбом find (освежавање регуларних интервала, типични cron посао) како би добили бржи метод претраге целог фајл система или фајла по имену.

Историја[уреди]

Наредба find уведена је у Version 5 Unix као део пројекта Programmer's Workbench, а написана је од стране Дика Хајта заједно са cpio.[1] Ове две наредбе су прављене да се користе заједно.[2]

Синтакса[уреди]

$ find [-H] [-L] [-P] path... [expression]

Три опције контролишу како ће команда find третирати симболичке линкове. Стандарно понашање јесте да се никада не прате симболички линкови. Ово се може специфично задати заставицом —P. —L заставица да команда find прати симболички линк. Заставица —H се користи како би се пратио симболички линк док се просесуирају аргументи командне линије. Са старинијм верзијама ове заставице нису доступне.

Барем једна путања мора постојати у изразу. Нареба find може да обради специјалне знакове па се мора строго водити ралуна са израдом ових команди како би се контолисао shell globbing.

Елементи у изразу су одвојени празним местима, а посматрају се са леве на десну страну. Могу садржати логичке елементе као што су AND и OR, као и много комплексније изразе. GNU наредба find има јако много додатних опција које нису наведене у POSIX стандарду.

POSIX заштита од неограниченог (бесконачног) излаза[уреди]

Наредба find детектује бесконачне петље, као што је улазак у већ посећен директоријум. Када се детектује улазак у бесконачну петљу, команда find враћа дијагностиковану поруку на стандардни излаз и/или се врати на своју почетну позицију.

Оператори[уреди]

Оператори се могу користити ради побољшања команде find. Команде су наведене у опадајућем поретку по корисности:

  • (expr) — тачно ако је израз expr тачан;
  • ! expr — тачно ако је израз expr нетачан;
  • expr1 expr2 (or expr1 -a expr2) — AND. expr2 није израчунљиво ако је expr1 нетачно;
  • expr1 -o expr2 — OR. expr2 није израчунљив ако је expr1 тачно
$ find . -name 'fileA_*' -o -name 'fileB_*'

Претражује тренутни директоријум тражећи фајл чије име почиње са fileA_ или fileB_ .

$ find . -name 'foo.cpp' '!' -path '.svn'

Претражује се тренутни директоријум изузев поддиректоријума „.svn” za fajlovima čije je ime „foo.cpp”. Знак узвија се ставља под знаке навода како га шел не би интерпретирао као карактер замене.

Појашњење type filter-а[уреди]

Велики број филтера је подржано од стране команде find. Активирају се користећи конфигурациони прекидач:

$ find -type x

где x може бити:


Конфигурациони прекидачи који су наведени тамним подебљаним словима су најчешће у употреби.

Примери[уреди]

Од тренутног директоријума[уреди]

$ find . -name 'my*'

Ова команда претражује фајлове иѕ тренутног директоријума чија имена почињу са my.

Само регуларни фајлови[уреди]

$ find . -name 'my*' -type f

Ово ограничава резултате претраге само на регуларне фајлове, стога искључује директоријуме, специјалне фајлове, симблочке линкове итд. my* је под полунаводницима јер би у супротном љуска то заменила са листом фајлова иѕ тренутног диреторијума чије име почиње са my

Команде[уреди]

Претходни примери креирали су листе резултата зато што команда find подраѕумевано иѕвршава и радњу -print.(Имајте на уму да раије верзије команде find нису имале ову подразумевану радњу; резултујућа листа била би одбачена што би збуњивало кориснике.)

$ find . -name 'my*' -type f -ls

Ово штампа информације о проширеним фајловима.This prints extended file information.

Претрага свих директоријума[уреди]

$ find / -name myfile -type f -print

Ово претражује регуларне фајлове чије име је myfile и штампа то на екрану. Претрага фајлова на овај начин обично није добра идеја. Ово може одуѕети доста времена, тако да је најбоље прециѕније одредити директоријум. Неки оперативни ситеми могу да повежу системе динамичких фајлове који нису усклађени са командом find. Сложеније називе фајлова укључујући посебне знакове можда ће бити потребно ставити под наводнике.

Претрага свих директоријума сем једне гране поддиректоријума[уреди]

$ find / -path excluded_path -prune -o -type f -name myfile -print

Ово претражује сваки директоријум сем гране поддиректоријума excluded_path која је скраћена радњом -prune за регуларан фајл чије ием је myfile.

Задати директоријум[уреди]

$ find /home/weedly -name myfile -type f -print

Ово претражује регуларне фајлове са именом myfile по /home/weedlyдиректоријуму. Треба увек навести директоријум прециѕније до најдаљег нивоа.

Више директоријума[уреди]

$ find local /tmp -name mydir -type d -print

Ово претражује директоријуме са именом mydir у local поддиректоријуму тренутног директоријума и /tmp директоријуму.

Игнорисање грешака[уреди]

Ако ово радите као корисник који није root, можда ћете желети да игноришете грешке у којима су одбијене доѕволе ( и неке друге). Пошто се грешке штампају на stderr, оне могу бити изостављене преусмеравањем иѕлаѕа до /dev/null. Следећи пример покаѕује како да урадимо ово у баш љусци:

$ find / -name myfile -type f -print 2> /dev/null

Ако сте csh или tcsh корисник, не можете преусмерити stderr без преусмеравања stdout. Можете користити sh да иѕвршите команду find да бисте ѕаобишли ово:

$ sh -c "find / -name myfile -type f -print 2> /dev/null"

Алтернативна метода када користите csh or tcsh је да повежемо излаз из stdout и stderr у grep команду. Овај пример покаѕује како се изостављају линије које садрже грешке у којима је одбијена дозвола.

$ find . -name myfile |& grep -v 'Permission denied'

Претрага фајлова са различитим именима[уреди]

$ find . \( -name '*jsp' -o -name '*java' \) -type f -ls

Оператор -ls штампа проширену информацију, а овај пример тражи било који регуларан фајл чије име се завршава или са 'jsp' или са 'java'. Приметите да су ѕаграде неопходне. У многим љускама са заградама се користе и косе црте како би се спречило да се заграде тумаче као посебни знакови љуске. Оператор -ls није доступан код свих верѕија команде.

Извршавање радње[уреди]

$ find /var/ftp/mp3 -name '*.mp3' -type f -exec chmod 644 {} \;

Ова команда мења дозволе свих регуларних фајлова чија имена се завршавају са .mp3 у директоријуму /var/ftp/mp3. Радња се изводи прецизним дефинисањем исказа -exec chmod 644 {} \; у команди. За сваки регуларан фајл чије име се завршава са .mp3, команда chmod 644 {} је извршена заменом {} са именом фајла. Тачка-зарез (косу црту користимо да би спречили да љуска то прикаже као раздвајач наредби) означава крај наредбе. Дозвола 644, обично приказана као rw-r--r--, даје власнику фајла дозволу за читање и писање фајла, док други корисници имају само дозволу за читање. У неким љускама, {} морају бити под наводницима. Тачка-зарез ";" је обично наведена са "\", али би исто тако ефективно могла да буде означена полунаводницима.

Команда не би требала да буде цитирана; у супротном добијамо поруку да постоји грешка

find: echo "mv ./3bfn rel071204": No such file or directory

што значи да команда find покушава да изврши фајл под називом 'echo "mv ./3bfn rel071204"' и не успева.

Ако ћете извршавати више резултата, ефикасније је користити варијанту примарног извршавања која сакупља имена фајлова до ARG_MAX а онда извршава COMMAND са листом имена фајлова.

$ find . -exec COMMAND {} +

Ово ће осигурати да имена фајлова са размацима буду прослеђена ка COMMAND тако да их љуска не подели.

Брисање фајлова и директоријума[уреди]

Радња -delete је GNU наставак, и коришћењем тога укључујемо -depth. Ако тестирамо find команду са -print уместо са -delete да би схватили шта се дешава потребно је да користимо -depth -print.

Брисање празних фајлова и штампање имена (приметите да је -empty јединствено проширење из GNU find команде која није доступна у свим применама find команде):

$ find . -empty -delete -print

Брисање празних рагуларних фајлова:

$ find . -type f -empty -delete

Брисање празних директоријума:

$ find . -type d -empty –delete

Брисање празних фајлова са именом 'bad':

$ find . -name bad -empty –delete

Упозорење. - Радња -delete би требала бити коришћена са условима као што су -empty или -name: Warning. — The -delete action should be used with conditions such as -empty or -name:

$ find . -delete # this deletes all in .

Претрага ниске[уреди]

Ова команда ће тражити ниску по свим фајловима /tmp директоријума:

$ find /tmp -type f -exec grep 'search string' /dev/null '{}' \+

Аргумент /dev/null је коришћен да прикаже име фајла пре пронађеног текста. Без тога, само пронађени текст је штампан. GNU grep може бити коришћен сам да извршава овај задатак:

$ grep -r 'search string' /tmp

Пример претраге ниске "LOG" у jsmith-овом home директоријуму:

$ find ~jsmith -exec grep LOG '{}' /dev/null \; -print
/home/jsmith/scripts/errpt.sh:cp $LOG $FIXEDLOGNAME
/home/jsmith/scripts/errpt.sh:cat $LOG
/home/jsmith/scripts/title:USER=$LOGNAME

Пример претраге за ниском "ERROR" у свим XML фајловима у тренутном директоријуму:

$ find . -name "*.xml" -exec grep "ERROR" /dev/null '{}' \+

Стављање ниски под наводнике (" ") и полунаводнике (' ') је необавезно у овом примеру али они су ту да обезбеде размаке и друге посебне знакове у ниски. Приметите да су код сложенијих текстова (посебно у већини популарних љуски које потичу из `sh` и `csh`) полунаводници често лакши избор јер наводници не спречавају сва посебна тумачења. Цитирање имена фајлова која имају енглеске скраћенице приказује како ово може постати прилично компликовано јер је ниску са апостофом лакше заштитити наводницима:

$ find . -name "file-containing-can't" -exec grep "can't" '{}' \; -print

Претрага свих фајлова одређеног корисника[уреди]

$ find . -user <userid>

Претрага уз игнорисање величине слова[уреди]

Приметите да -iname није стандардан и неће бити подржан код свих примена:

$ find . -iname 'MyFile*'

Ако -iname није подржан на вашем систему можете користити:

$ find . -name '[mM][yY][fF][iI][lL][eE]*'

Да би се изградила команда изнад користи се Perl(обично код овакве употребе знакови нису добро цитирани пре уношења у стандардни улаз`sh`):

$ echo 'MyFile*' | perl -pe 's/([a-zA-Z])/[\L\1\U\1]/g;s/(.*)/find . -name \1/' | sh

Претрага по величини[уреди]

Претрага фајлова чија је величина између 100 килобајта и 500 килобајта:

$ find . -size +100k -a -size -500k

Претрага празних фајлова:

$ find . -size 0k

Претрага непразних фајлова:

$ find . ! -size 0k

Претрага по величини и имену[уреди]

$ find /usr/src ! \( -name '*,v' -o -name '.*,v' \) '{}' \; -print

Ова команда ће претражити /usr/src директоријум. Сви фајлови облика '*,v' и '.*,v' су искључени. Важни аргументи које треба напоменути налазе се у tooltip.

for file in `find /opt \( -name error_log -o -name 'access_log' -o -name 'ssl_engine_log' -o -name 'rewrite_log' -o
-name 'catalina.out' \) -size +300000k -a -size -5000000k`; do
cat /dev/null > $file
done

У [bckw] јединице су следеће, 'b' значи 512-бајтних блокова, 'c' значи бајт, 'k' значи килобајт and 'w' значи 2-bајтне речи. Величина не рачуна индиректне блокове, али рачуна блокове у ретким фајловима који нису заправо додељени.

Референце[уреди]

  1. ^ McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971—1986 (PDF) (Технички извештај). CSTR. Bell Labs. 139. 
  2. ^ „libarchive/libarchive”. GitHub. Приступљено 2015-10-04. 

Спољашње везе[уреди]