Команда 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 може бити:
- b - block device (buffered);
- c - character device (unbuffered);
- d - директоријум;
- f - regular file;
- l - symbolic link;
- p - named pipe;
- s - socket;
- D - door.
Конфигурациони прекидачи који су наведени тамним подебљаним словима су најчешће у употреби.
Примери
[уреди | уреди извор]Од тренутног директоријума
[уреди | уреди извор]$ 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ајтне речи. Величина не рачуна индиректне блокове, али рачуна блокове у ретким фајловима који нису заправо додељени.
Сродне команде
[уреди | уреди извор]locate
команда која претражује баѕу података која је сачињена од фајлова уместо директоријума. Бржа је од командеfind
али и мање прецизна ѕато што база података можда није надограђена.grep
команда претражује датотеке или стандардни улаз, тражећи редове текста који одговарају задатом регуларном изразу, и исписује их на стандардни излаз.
Референце
[уреди | уреди извор]- ^ McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971—1986 (PDF) (Технички извештај). CSTR. Bell Labs. 139.
- ^ „libarchive/libarchive”. GitHub. Приступљено 2015-10-04.
Спољашње везе
[уреди | уреди извор]- The Single UNIX® Specification, Issue 7 from The Open Group : find files – Commands & Utilities Reference,
- Official webpage for GNU find
- Command find – 25 practical examples