Новичку — Поиск в linux
Здравствуйте. В этой короткой статье я хочу рассказать немного о способах поиска нужного файла в дебрях операционной системы linux.
Вместо оглавления:
1) Кому адресована статья?
2) Методы поиска.
3) Микробонус.
Это описание расчитано на не слишком опытного пользователя 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":
Отлично! Теперь вы можете искать файлы очень гибко варьируя условия для поиска. А что делать дальше, спросите вы? Использовать параметр -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 возвращает все файлы, в имени или названии каталога которого есть искомая строка.
Как видите, результатом работы команды является список абсолютных путей, которые таки или иначе включают в себя подстроку xauth.
Ещё, наверное, нужно сказать что базу данных locate можно обновить принудительно командой updatedb (нужны права суперпользователя). Если вы не можете найти необходимый файл, попробуйте обновить базу данных.
cepxuo напомнил мне о ещё одной полезной программе - whereis. Whereis ищет файлы в пределах каталогов, указанных в переменной PATH. То есть, если вам необходимо уточнить полный путь до некоторой программы (например, cat), можно дать команду whereis cat и получить полный путь до исполняемого файла программы cat (это, кстати, /bin/cat).
За сиим позвольте откланяться. Удачного поиска.
Вместо оглавления:
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 |
|
Как видите, результатом работы команды является список абсолютных путей, которые таки или иначе включают в себя подстроку xauth.
Ещё, наверное, нужно сказать что базу данных locate можно обновить принудительно командой updatedb (нужны права суперпользователя). Если вы не можете найти необходимый файл, попробуйте обновить базу данных.
И ещё совсем немного...
cepxuo напомнил мне о ещё одной полезной программе - whereis. Whereis ищет файлы в пределах каталогов, указанных в переменной PATH. То есть, если вам необходимо уточнить полный путь до некоторой программы (например, cat), можно дать команду whereis cat и получить полный путь до исполняемого файла программы cat (это, кстати, /bin/cat).
За сиим позвольте откланяться. Удачного поиска.