За системен администратор


Бързо търсене на файлове по име - намерете помощната програма

намирам решава почти всички задачи, които потребителят може да има във връзка с търсенето и последващата обработка на необходимите файлове или директории. Доста често обаче възникват ситуации, когато, от една страна, не се нуждаете от цялата мощ намирам, от друга страна, исках търсенето да бъде по-бързо и без значително натоварване на системата. След бягане намирам с някакво сложно състояние и дори извикване на външни команди, и като посочите да започне търсенето от главната директория, можете да постигнете, че системата ще бъде толкова заредена, че вашият системен администратор ще мисли за посещението на kul hatskers като греховно нещо, но разбира се не сме животни и не плашим нашия администратор. Следователно за глобално търсене ще използваме помощната програма locate.

Използване на locate

Тази помощна програма е просто незаменима, ако знаете поне приблизително името на файла, който искате да намерите. Отличителна черта на тази команда, да речем, от една и съща находка, е, че по време на работа тя наистина не сканира файловата система, търсенето се извършва в предварително изградена база данни, която като че ли съхранява моментна снимка от файловата система . Такава моментна снимка се извършва с помощта на командата locate -u или updatedb, която наистина избутва твърдите или мрежовите ви дискове и записва имената на всички намерени файлове в базата данни. Естествено, тази процедура е доста ресурсоемка и може да отнеме доста време. Обикновено се изпълнява от crontab, който изпълнява updatedb с необходимата честота. Честотата на актуализиране на базата данни зависи от това колко често се актуализира съдържанието на файловата система, както и колко важно е значението на данните. По този начин базата данни обикновено се актуализира автоматично веднъж седмично или ръчно, след като вие или системният администратор сте инсталирали нова партида нов софтуер. Имайте предвид, че за да актуализирате базата данни, трябва да имате права на суперпотребител.

Ще дам най-простия пример за употреба:

$ locate traceroute
/usr/man/man8/traceroute.8.gz
/ usr/sbin/traceroute6
/ usr/sbin/traceroute
$ намерете mpg123
/usr/doc/mpg123-0.59r
/usr/doc/mpg123-0.59r/BUGS
/usr/doc/mpg123-0.59r/ ПРОМЕНИ
/usr/doc/mpg123-0.59r/ КОПИРАНЕ
/usr/doc/mpg123-0.59r/ ИНСТАЛИРАНЕ
/usr/doc/mpg123-0.59r/JUKEBOX
/usr/doc/mpg123-0.59r/README
/usr/doc/mpg123-0.59r/TODO
/usr/doc/mpg123-0.59r/mp3license
/usr/man/man1/mpg123.1.gz
/ usr/bin/mpg123
$

От тези примери има три важни точки относно поведението на местоположението. Първо се търсят всички файлове и директории, в чиито имена се появява поднизът, даден като аргумент. На второ място, файловете се показват, включително пълният път до тях. На трето място, даденият подниз може да не е включен в името на самия файл, но може да се появи по пътя му. Така във втория пример, съдържанието на директорията беше изцяло включено в списъка с намерени файлове mpg123-0.59r.

Понякога се изисква по-точно търсене, когато трябва да ограничите мястото, където може да влезе даден подниз. Да кажем, ако трябва да намерим само файлове и директории, чиито имена включват mpg123. В този случай можете да използвате модели "ала баш" (не забравяйте *,?, [.]) Или по-усъвършенствана версия, използвайки регулярни изрази. Предпочитам второто, тъй като е по-мощно и напреднало.

За да кажете на locate, че искате да използвате регулярни изрази, трябва да посочите формата locate -r. Така че в нашия случай заявката ще изглежда така:

$ locate -r "mpg123 [^ /] * $"
/usr/doc/mpg123-0.59r
/usr/man/man1/mpg123.1.gz
/ usr/bin/mpg123
$

Линия mpg123 [^ /] * $ - иска locate, за да намери тези файлове, в които след подниза mpg123 може да има нула или повече символи, с изключение на символа /, последван от края на реда. По този начин редове като /usr/doc/mpg123-0.59r/BUGS са изключени от резултата от търсенето.

Друга полезна функция е формата на извикване на locate -i. Опцията -i ви казва да извършите търсене без регистрация:

$ locate "/ etc/dir"
/usr/local/share/emacs/21.1/etc/dired-ref.ps
/usr/local/share/emacs/21.1/etc/dired-ref.tex
$ locate -i "/ etc/dir"
/usr/local/share/emacs/21.1/etc/dired-ref.ps
/usr/local/share/emacs/21.1/etc/dired-ref.tex
/ и т.н./DIR_COLORS
$

Използвайте заедно с други команди

От само себе си намерете не прави нищо, освен да отпечата имената на файловете, които искате. Възможно е обаче не винаги да бъдете доволни само от обмислянето на имената и местоположението на намерените файлове. Тук на помощ ви идват любимите ви тръбопроводи, конвейери и други радости от командния ред.

Например искаме да получаваме, в допълнение към самите файлове, информация за атрибутите на тези файлове. В този случай на помощ ни идва заместването на команди:

$ намерете crontab
/usr/man/man1/crontab.1.gz
/usr/man/man5/anacrontab.5.gz
/usr/man/man5/crontab.5.gz
/ usr/bin/crontab
/ и т.н./anacrontab
/ и т.н./crontab
$ ls -ld `!`
ls -ld `намерете crontab`
-rw-r - r - 1 корен на корен 370 март 3 2000/etc/anacrontab
-rw-r - r - 1 корен корен 255 август 27 1999/etc/crontab
-rwsr-xr-x 1 корен корен 21816 3 февруари 2000/usr/bin/crontab
-rw-r - r - 1 корен корен 1584 3 февруари 2000 /usr/man/man1/crontab.1.gz
-rw-r - r - 1 корен корен 669 март 3 2000 /usr/man/man5/anacrontab.5.gz
-rw-r - r - 1 корен корен 3495 февруари 3 2000 /usr/man/man5/crontab.5.gz
$

В този пример с първата команда получихме списък с интересуващи ни файлове, а втората предаде този списък на командата ls -ld, в резултат на което получихме прекрасен списък с необходимата информация. Опцията -d казва на ls вместо това да изброи атрибутите на директорията.

Методът на заместване е подходящ, ако нямаме много файлове. В противен случай може да срещнем ограничение за дължината на низ от параметри, предаден от ls -l. Например:

Както можете да видите, опцията не работи. Следователно, ако се очаква голям брой изходни файлове, би било за предпочитане да се използва помощната програма xargs, която просто чете своя входен поток, разбива го на редове и след това подава тези редове на малки порции към програмата, предадена му като параметър. За да стане по-ясно, ще дам прост пример, в който можете да видите какво прави xargs:

$ ls/usr/
X11R6 и т.н. информация човек
bin игри kerberos sbin -
cvsroot i386-redhat-linux lib share
dict i486-linux-libc5 libexec src
doc включва локален tmp

$ ls/usr/| xargs -n 5 ехо
X11R6 bin cvsroot dict док
и т.н. игри i386-redhat-linux i486-linux-libc5 включват
информация kerberos lib libexec локално
човек sbin споделяне src tmp
$

Ето резултата от бягане ls/usr / насочен към входа xargs -n 5, който разделя получените редове на пет и ги предава като аргумент на командата ехо, както се досещате, броят на параметрите се задава с помощта на параметъра .

В нашия случай не е необходимо да указвате броя на параметрите, тъй като той е незначителен в този случай, основното е, че ограничението за размера на аргумента не е надвишено и тази задача xargs решава без помощ:

$ locate/| xargs ls -ld | wc -l
70968
$

Както можете да видите, тази опция, за разлика от предишната, работи.

Когато locate не се търкаля.

Както винаги, отрицателните аспекти на локацията произтичат директно от положителните му аспекти. По този начин информацията за файловете в базата данни може да остарее след последната актуализация и може да не отговаря на текущото състояние на файловата система, някои файлове могат да бъдат изтрити, някои преименувани, други добавени. И ако по принцип няма проблеми с изтриването, тъй като locate, след търсене в своята база данни, проверява за наличие на намерени файлове в системата, тогава locate не е приятелски настроен към нови или преименувани файлове, те ще отсъстват в резултатите:

Ако вие и потребителят или root сте в едно лице, тогава проблемът се решава чрез ръчно актуализиране на базата данни, в противен случай ще трябва да използвате нещо по-мощно, като например.

Друг момент, на който си струва да се обърне внимание, е, че locate съхранява името на самия файл и пътя към него като низ и следователно в общия случай не можете да разберете дали намереният низ е файл, символна връзка или директория директно с помощта на locate.

Понякога използването на locate не е ефективно, така че беше даден леко изкуствен пример, когато намерихме всички файлове в системата и след това показахме техните атрибути, използвайки ls -ld. В този случай по-правилното решение е да се използва една и съща находка, факт е, че в горния случай сканирането на системата няма значение, само че няма намерете, и ls, добавете тук режийните тръбопроводи, xargs, и резултатът е:

$ котка/tmp/л
намерете -f proc/| xargs -n 1000 ls -ld
$ cat/tmp/f
намери/-ls 2>/dev/null
$ time/tmp/f>/dev/null
3.83user 2.80system 0: 06.99 изтекъл 94% CPU (0avgtext + 0avgdata 0maxresident) k
0входа + 0изхода (358основна + 147минорна) грешки на страницата 0промени
$ time/tmp/l>/dev/null
5.41user 5.92system 0: 11.62 изтекъл 97% CPU (0avgtext + 0avgdata 0maxresident) k
0входа + 0изхода (28176основен + 11719мин.)

Както можете да видите в този случай, намерете заедно с компанията, която е попаднала в локва, изпълнявайки възложената задача два пъти по-бавно от търсенето. Разбира се, примерът е измислен, но илюстрира факта, че преди да реши какъвто и да е проблем, той не пречи на промиването на мозъци!