Online video hd

Смотреть hd видео

Официальный сайт openw 24/7/365

Смотреть видео бесплатно

21.09.10 16:18 uscr

НовичкуПоиск в linux

Здравствуйте. В этой короткой статье я хочу рассказать немного о способах поиска нужного файла в дебрях операционной системы linux.

Вместо оглавления:
1) Кому адресована статья?
2) Методы поиска.
3) Микробонус.

Для кого эта статья?


Это описание расчитано на не слишком опытного пользователя linux. Я, например, в первые месяцы использования ОС linux боялся самой идеи о поиске файлов с помощью консоли. Прочитав её, вы сможете быстро найти нужный вам файл, зная только некоторые его параметры. Опытные пользователи, скорее всего, не узнают ничего нового.



Как можно искать в linux



Существует множество различных программ для поиска, но в этом описании я остановлюсь только на двух стандартных программах, которые гарантированно есть в вашем дистрибутиве - find и locate.

FIND
Если вы знакомы с иностранными языками, то такое название для программы поиска совсем не должно вас удивлять. Это удобная программа, которая умеет искать файлы и каталоги, просматривать все каталоги в системе или только заданный, искать файлы на заданную глубину и файлы с указанными атрибутами. Что тут можно ещё добавить? Команда find имеет множество доступных параметров. Всё это можно почитать, введя команду man find в терминале. Обработка параметров, переданных команде производиться последовательно: с лева на право. Об этом нюансе немного позже.

Теперь немного примеров:

find /home -user superuser

Эта команда выплюнет на экран список абсолютных путей для всех файлов в директории /home, которые принадлежат пользователю с именем superuser.

Просто? Даже слишком.
Давайте грянем!

find . -name "[A-Z]*.php" -mtime +30 -perm 665 -user brainfucker

Так себе грянули, но пример усложнился.
Теперь по порядку:
. - ссылается на текущий каталог. Иными словами, искать мы будем в текущем каталоге.
-name "[A-Z]*.php" - найти все файлы, имя которых начинается с заглавной буквы латинского алфавита ([A-Z]) и заканчивается на .php
-mtime +30 Искать файлы, которые были изменены более чем 30 дней назад. Здесь речь идёт именно о времени последних изменений. Ещё можно проверять, например, дату последнего чтения параметром atime. Подробнее смотрите в справочной странице.
-perm 665 Искать файлы, на которые установлены права доступа 665.
-user brainfucker Это уже знакомый параметр поиска по имени владельца файла.
Под спойлером постарался разжевать выражение "[A-Z]*.php":
Обратите внимание - шаблон для поиска задаётся в кавычках. Звёздочка - означает "любая последовательность символов". В нашем случае, это означает что мы ищем файл, с именем, начинающимся с прописной, далее может следовать абсолютно любая абракадабра. Но мы жёстко задаём окончание файла - .php и никак иначе! Например: имя файла HffRG34EWEDgdf.php нам подходит, а fRGv56w3Cdf.php и Def4GtHHy456.phps не подходят.


Отлично! Теперь вы можете искать файлы очень гибко варьируя условия для поиска. А что делать дальше, спросите вы? Использовать параметр -exec, невозметимо отвечу я! Этот параметр передаст список файлов указанной программе.
Например:

find /home -user superuser -exec chmod 777

найдёт файлы пользователя superuser и установит на них права доступа 777 (chmod 777). Бывает так, что длина командной строки может быть ограничена, поэтому, если файлов слишком много, система выдаст ошибку. Тогда для дальнейшей обработки файлов используют передачу stdout программы find (собственно, список файлов) программе xargs. Тут всё аналогично. Только форма записи немного отлична:

find . -perm 777 | xargs rm
такая строка, будучи запущенной на исполнение, удалит все файлы с правами доступа 777 в текущей директории.

Будьте осторожны!
find обрабатывает параметры, переданные ей, последовательно. Так, если вы захотите удалить из некоторого каталога файлы, по очень точно подобранным параметрам, то опцию -delete нужно указать после всех других параметров. Ещё 2 примера:

find / -name "[A-Z]*" -mtime +30 -perm 665 -user brainfucker -delete

В этом случае я удалю все файлы в системе, имена которых начинаются с заглавной буквы, которые были изменены более 30 дней назад, на которые установлены права доступа 665 и при всём этом принадлежащие юзеру brainfucker. Всё правильно.

find / -delete -name "[A-Z]*" -mtime +30 -perm 665 -user brainfucker

В этом случае я удалю всё. Вообще всё. Почему? Команда find, которой в качестве параметра передан каталог, "найдет" вообще все файлы в этом каталоге. В данном случае, список файлов из каталога / будет передан на удаление, без применения всех остальных фильтров.

LOCATE
Locate простой. Его основное (и единственное?) преимущество - скорость. Find перебирает все файлы в указанном каталоге и просматривает их на соответствие параметрам. Locate зараннее знает где что у вас есть. Для этого раз в сутки (если не настроено иначе), обновляется специальная база данных, с которой locate работает.

Locate возвращает все файлы, в имени или названии каталога которого есть искомая строка.

1
2
3
4
5
6
7
8
9
10
11
12
13

$locate xauth
/home/mj/.xauth
/home/mj/.xauth/refcount
/home/mj/.xauth/refcount/root
/home/mj7 .xauth/refcount/root/testlinux
/lib/security/pam_xauth.so
/usr/XllR6/bin/mkxauth
/usr/XllR6/bin/xauth
/usr/XllR6/man/manl/mkxauth.1x.gz
/usr/XllR6/man/manl/xauth.1x.gz
/usr/share/doc/pam-0.72/txts/README.pam_xauth
/usr/share/man/man8/pam_xauth.8.gz


Как видите, результатом работы команды является список абсолютных путей, которые таки или иначе включают в себя подстроку xauth.

Ещё, наверное, нужно сказать что базу данных locate можно обновить принудительно командой updatedb (нужны права суперпользователя). Если вы не можете найти необходимый файл, попробуйте обновить базу данных.

И ещё совсем немного...


cepxuo напомнил мне о ещё одной полезной программе - whereis. Whereis ищет файлы в пределах каталогов, указанных в переменной PATH. То есть, если вам необходимо уточнить полный путь до некоторой программы (например, cat), можно дать команду whereis cat и получить полный путь до исполняемого файла программы cat (это, кстати, /bin/cat).
За сиим позвольте откланяться. Удачного поиска.



Midler 21.09.10 16:27 # +1
Бгг = )
Есть ещё один способ (костыльный):
cat / |grep ЧТО_ИЩЕМ
dieformetal 21.09.10 16:37 # +1
У меня в ливдиске Убунты 8.04 сказало:
cat: /: Is a directory
Midler 21.09.10 17:59 # +1
Тьфу!
Заработался
find / |grep то что ищем
beetlebum 21.09.10 18:17 # +3
ls -R | grep keyword
HTaeD 21.09.10 20:50 # +0
grep -R 'keyword' /
digiwhite 21.09.10 18:50 # +0
А я очень часто использую find . -exec grep -l anything {}, когда надо файл внутри которого лежит то, что мне нужно (например объявление макроса или типа). Правда работаю в unix системе древнего года, поэтому ключи в grep могут отличаться.
nikebl 21.09.10 16:33 # +0
Только сегодня пришлось писать скрипт для "мягкого" удаления файлов из хранилищ кэша одного веб-проекта, ух и намаялся я с этим файндом, жаль что у него нет ключа как у locate для вывода только определенного кол-ва строк, все через костыли пришлось делать...

З.Ы. Первое что делаю заходя на новый для меня сервак - сношу locate нахрен :)
Username 21.09.10 16:37 # +2
Напротив, при поиске юзаю только локейт. Очень быстро и очень удобно.
файнд медленноват.
dieformetal 21.09.10 16:38 # +0
А зачем сносишь-то?
nikebl 21.09.10 17:44 # +3
Преимущество(и недостаток) locate пере find в том, что он использует построенную до этого БД(перед тем как выдавать результат ему надо проиндексировать все файлы у вас на компе), и когда вебсервер, хранящий, допустим, 5 гб нагенеренного кэша(файлики по 2-20 кб) запускает locate`овский updatedb машина ложится нафиг. Даже если нету такого кэша и машинка виртуальная - все равно ляжет.
nikebl 21.09.10 17:47 # +0
Кстати, по поводу моего скрипта, может есть у кого идеи как ограничить вывод find somedir -type f только сотней результатов? весь мозг себе сломал.
dieformetal 21.09.10 17:52 # +1
find somedir -type f | head -n NUM
nikebl 22.09.10 01:22 # +3
Не все так просто :)
Список файлов директории которую надо удалять занимает где то 500 мб...
1 find отрабатывает за 4 часа.


Омг... только что попробовал - head прерывает работу файнда после получения 100 строк. Чет я перемудрил.

Спасибо. :)
kstep 22.09.10 08:21 # +3
Да, это свойство пайпов. head завершается после вывода n строк, что приводит к закрытию пайпа с его стороны, а find в итоге получает сигнал SIGPIPE, ЕМНИП, т.к. писать больше некуда, и по этому сигналу завершается. Этот же механизм работает во многих других случаях.
dieformetal 21.09.10 17:50 # +0
Насколько я помню, можно настроить locate на ручное обновление only. Но не уверен.
uscr 21.09.10 18:15 # +2
ЕМНИП, локейту можно запретить индексировать определенные директории, раз уж на то пошло.
nikebl 22.09.10 01:24 # +0
На сервере проще удалить, он там не нужен.
cepxuo 21.09.10 16:54 # +1
Иногда мне бывает нужно использовать скрипте какой-нибудь исполняемый файл. Но вот незадача, я не помню где точно он лежит. То-ли в /bin, то-ли в /sbin, а может и в /usr/bin или /usr/sbin, или ещё где-нибудь. Можно в таком случае спросить у locate, ну а я привык спрашивать у whereis (опять-таки любителям иностранных слов посвящается). Например, чтоб найти файл cat я даю команду whereis cat и она мне быстренько отвечает где оно лежит :)

PS: так что можете добавить ещё и whereis
PPS: спасибо за статью! Я так понял она - в рамках тематической недели "как это работает".
uscr 21.09.10 16:58 # +1
Я постеснялся замахиваться на тематическую неделю, поэтому оставил это на усмотрение администрации. Про whereis совсем забыл, а ведь и правда удобная штука. Сейчас добавлю.
pumbur 21.09.10 18:49 # +2
а ещё есть where и which. они делают то же самое, только учитывая имена и алиасы внутри шелла.
imurzich 21.09.10 17:27 # +11
Хочу добавить к вышесказанному ещё небольшой момент связанный с обработкой файлов с именами типа ?????????.??? - такое иногда получается и просто так их ни удалить ни переименовать нельзя :(

Но тут на помощь приходит возможность работы по inode файла.

# Определяем inode файла

ls -i


# Проверяем найденный inode

find . -inum [inode] -print


# Переименовываем файл

find . -inum [inode] -exec mv {} [new_name] \;


# Или же просто удаляем его (если это являлось нашей целью)

find . -inum [inode] -exec rm {} \;


Взято сие отсель
predator 21.09.10 22:37 # +1
То есть, если вам необходимо уточнить полный путь до некоторой программы (например, cat), можно дать команду whereis cat

А лучше `which cat`
opium_inside 22.09.10 06:42 # +5
Хочу добавить, что неосиляторы люди с плохой памятью и новички могут генерировать себе команду find с гуманоидным интерфейсом тут
delorfin 22.09.10 14:24 # +0
web-gui :)

Посты Комментарии
Последние посты
    Посты Комментарии
    Последние комментарии
      Посты Комментарии
      Изменения
        Посты Комментарии Изменения Черновики Избранное
        Черновики (все)
          Посты Комментарии Изменения Черновики Избранное
          Избранное (всё)
            Посты Комментарии Изменения Черновики Избранное
            Лучшие блоги (все 140)
            Топ пользователей Топ блогов
            Топ пользователей Топ блогов
            Элита (все 2774 из 212 городов)
            Топ пользователей Топ блогов
            welinux.ru

            Смотреть видео онлайн

            Онлайн видео бесплатно


            Смотреть русское с разговорами видео

            Online video HD

            Видео скачать на телефон

            Русские фильмы бесплатно

            Full HD video online

            Смотреть видео онлайн

            Смотреть HD видео бесплатно

            School смотреть онлайн