*КУБ — полный комплекс облачных услуг!

Поиск в Linux с помощью команды find

Linux
Поиск Linux с помощью команды find

Утилита find — это универсальный и функциональный способ поиска в Linux. Эта статья представляет собой памятку с описанием и примерами её использования. Если вы работаете с удалённым сервером, все приведённые команды можно применять на Linux VPS, где утилита find помогает быстро находить файлы, анализировать их состояние и автоматизировать администрирование системы.

Общий синтаксис

find

путь к корневому каталогу, с которого следует начать поиск. Например, find /home/user — поиск в соответствующем каталоге. Для текущего каталога используйте точку «.».

это набор правил для поиска.

* По умолчанию поиск является рекурсивным. Для поиска в определённом каталоге можно использовать опцию maxdepth.

Описание опций

ОпцияОписание
-nameПоиск по имени.
-inameCaseпоиск по имени без учета регистра.
-typeТип объекта поиска. Возможные варианты: f – файл; d – каталог; l – ссылка; p – канал; s – сокет.
-sizeРазмер объекта. Указывается в блоках по 512 байт или просто в байтах (с символом «c»).
-mtimeВремя модификации файла. Указывается в днях.
-mminИзменить время в минутах.
-atimeВремя последнего доступа к объекту в днях.
-aminВремя последнего доступа в минутах.
-ctimeПоследнее изменение владельца или прав на объект за последние дни.
-cminПоследний владелец или изменение прав за последние минуты.
-userПоиск по владельцу.
-groupПо группам.
-permС определенными правами доступа.
-depthПоиск следует начинать не с корневого каталога, а с самого глубоко вложенного каталога.
-maxdepthМаксимальная глубина поиска в каталоге. -maxdepth 0 — поиск только в текущем каталоге. По умолчанию поиск является рекурсивным.
-pruneИсключить указанные каталоги.
-mountНе переходить на другие файловые системы.
-regexПо имени с регулярным выражением.
-regextype Тип регулярного выражения.
-L или -followОтображает содержимое символических ссылок (symlinks).
-emptyПоиск пустых каталогов.
-deleteУдалить найденные файлы.
-lsВывод как ls -dgils
-printПоказать найденные файлы.
-print0Путь к найденным объектам.
-exec <команда> {} \;Выполнить команду над найденным объектом.
-okВыводить запрос перед выполнением -exec.

Также доступны логические операторы:

ОператорОписание
-aЛогическое И. Объедините несколько критериев поиска.
-oЛогическое ИЛИ. Команда поиска выполняет поиск на основе одного из критериев поиска.
-not or !Логическое НЕ. Инвертирует поисковый термин.

Полный набор доступных опций можно получить с помощью команды man find.


Найти примеры использования

Поиск файла по имени

1. Простой поиск по имени:

find / -name “file.txt”

* В этом примере будет выполняться поиск по всей файловой системе файла с именем file.txt, начиная с корневого каталога /.

2. Поиск файла по части имени:

find / -name “*.tmp”

* Эта команда будет искать все папки или файлы в корневом каталоге /, имеющие расширение .tmp

3. Несколько условий.

a) Логическое И. Например, файлы, начинающиеся с sess_ и заканчивающиеся на cd :

find -name “sess_*” -a -name “*cd”

б) Логическое ИЛИ. Например, файлы, начинающиеся с sess_ или заканчивающиеся на cd :

find -name “sess_*” -o -name “*cd”

c) Регулярные выражения имеют более компактную форму, например:

find -regex ‘.*/\(sess_.*cd\)’

find. -regex ‘.*/\(sess_.*\|.*cd\)’

* где в первом поиске используется выражение, подобное примеру а), а во втором — б).

4. Найти все файлы, кроме .log:

find. ! -name “*.log”

* В этом примере мы использовали логический оператор !.

Поиск по дате

1. Поиск файлов, которые были изменены определенное количество дней назад:

find. -type f -mtime 60

* эта команда найдет файлы, которые были изменены более 60 дней назад.

Или в промежутке:

find. -mmin -20 -mmin 10 -type f

* найти все файлы, которые были изменены более 10 минут назад, но не более 20 минут назад.

2. Поиск более новых файлов. Эта опция доступна начиная с версии 4.3.3 (её можно увидеть с помощью команды find –version).

a) дата изменения:

find. -type f -newermt “2019-11-02 00:00”

* покажет все файлы, которые были изменены после 02.11.2019 00:00.

find. -type f -newermt 2019-10-31 ! -newermt 2019-11-02

* найдет все файлы, которые были изменены в период с 31.10.2019 по 01.11.2019 (включительно).

б) дата применения:

find. -type f -newerat 2019-10-08

* все файлы, к которым был осуществлен доступ с 10.08.2019.

find. -type f -newerat 2019-10-01 ! -newerat 2019-11-01

* все файлы, к которым был осуществлен доступ в октябре.

c) дата создания:

find. -type f -newerct 2019-09-07

* все файлы, созданные с 7 сентября 2019 года.

find. -type f -newerct 2019-09-07 ! -newerct “2019-09-09 07:50:00”

* файлы, созданные с 07.09.2019 00:00:00 по 09.09.2019 07:50

Тип

Искать в текущем каталоге и всех его подкаталогах только файлы:

find. -type f

* f – поиск только файлов.

Поиск по правам доступа

1. Мы ищем всех, кто умеет читать и писать:

find / -perm 0666

2. Найти файлы, к которым имеет доступ только владелец:

find / -perm 0600

Поиск файлов по содержанию

find / -type f -exec grep -i -H “content” {} \;

* В этом примере выполняется рекурсивный поиск всех файлов в каталоге / и выводится список тех, которые содержат строку content.

Отсортировано по дате изменения

find /data -type f -printf ‘%TY-%Tm-%Td %TT %p\n’ | sort-r

* Команда найдет все файлы в каталоге /data, добавит дату модификации к имени и отсортирует данные по имени. В результате файлы будут расположены в том порядке, в котором они были изменены.

Ограничение количества результатов вывода

Наиболее распространённым примером является вывод одного файла, который был изменён последним. Возьмём пример сортировки и добавим следующее:

find /data -type f -printf ‘%TY-%Tm-%Td %TT %p\n’ | sort -r | head -n 1

Поиск с выполнением (exec)

1. Найдите только файлы, начинающиеся с sess_, и удалите их:

find -name “sess_*” -type f -print -exec rm {} \;

-print не является обязательным, но он покажет всё, что будет удалено, поэтому эта опция полезна, когда команда выполняется вручную.

2. Переименуйте найденные файлы:

find. -name “sess_*” -type f -exec mv {} new_name \;

или:

find. -name “sess_*” -type f | xargs -I ‘{}’ mv {} new_name

3. Переместите найденные файлы:

find. -name “sess_*” -type f -exec mv {} /new/path/ \;

* В этом примере мы переместим все найденные файлы в каталог /new/path/ .

4. Отобразить количество найденных файлов и папок, имена которых заканчиваются на .tmp:

find -name “*.tmp” | wc -l

5. Изменить права доступа:

find /home/user/* -type d -exec chmod 2700 {} \;

* В этом примере мы ищем все каталоги (тип d) в каталоге /home/user и устанавливаем для них права доступа 2700.

6. Передайте найденные файлы в конвейер (pipe):

find /etc -name ‘*.conf’ -follow -type f -exec cat {} \; | grep ‘test’

* В этом примере мы использовали find для поиска строки test в файлах, находящихся в каталоге /etc и имеющих расширение .conf. Для этого мы передали список найденных файлов команде grep, которая уже выполнила поиск в содержимом этих файлов.

7. Замена файлов с помощью команды sed:

find /opt/project -type f -exec sed -i -e “s/test/production/g” {} \;

* найдите все файлы в каталоге /opt/project и замените в них test на production.

Плановая очистка

Команда find полезна для автоматического удаления устаревших файлов.

Откройте задание cron для редактирования:

crontab -e

И добавьте:

0 0 * * * /bin/find /tmp -mtime 14 -exec rm {} \;

* В этом примере мы удаляем все файлы и папки из каталога /tmp, которые старше 14 дней. Задание выполняется ежедневно в 00:00.

* Мы проверяем полный путь к исполняемому файлу find с помощью команды which find — он может находиться в разных местах на разных системах UNIX.

Menu