*КУБ — полный комплекс облачных услуг!
Утилита find — это универсальный и функциональный способ поиска в Linux. Эта статья представляет собой памятку с описанием и примерами её использования. Если вы работаете с удалённым сервером, все приведённые команды можно применять на Linux VPS, где утилита find помогает быстро находить файлы, анализировать их состояние и автоматизировать администрирование системы.
find
* По умолчанию поиск является рекурсивным. Для поиска в определённом каталоге можно использовать опцию 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 |
| Показать найденные файлы. | |
| -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
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.