- Поиск файлов. Команда find
- Поиск в Linux с помощью команды find
- Общий синтаксис
- Описание опций
- Примеры использования find
- Поиск файла по имени
- Поиск по дате
- По типу
- Поиск по правам доступа
- Поиск файла по содержимому
- С сортировкой по дате модификации
- Лимит на количество выводимых результатов
- Поиск с действием (exec)
- Чистка по расписанию
Поиск файлов. Команда find
Одной из частых задач администрирования является поиск файлов на компьютере. Данная задача не так проста. Ведь поиск может производиться не только по имени, но и по множеству других свойств файла: размеру, владельцу, времени создания или изменения и др. Также искать можно в одном каталоге, во вложенных папках, в директориях, находящихся в разных ветвях дерева каталогов.
Таким образом, прежде чем выполнять поиск файлов, надо ответить на два вопроса: что искать и где искать. Отвечая на вопрос «что искать» мы должны указать свойство, по которому выполняется поиск, и его значение или диапазон значений. Пусть требуется найти файлы определенного размера, тогда запрос может быть сформулирован так: «найти файлы, размер которых больше 100 мегабайт».
Запрос может быть более сложным, предполагать поиск сразу по нескольким свойствам. Например, надо найти файлы с определенным расширением, созданные за два последних дня.
При поиске по имени часто используются шаблоны и регулярные выражения, так как человек может не помнить полного имени, или выполняется поиск группы файлов. В последнем случае целью обычно является не столько сам поиск файлов, сколько их фильтрация. То есть выделение из общей массы с последующим выполнением той или иной операции, например, перемещения.
Отсюда следует, что в формуле «где искать + что искать» может быть третья составляющая – «что делать с найденным».
В командной оболочке Unix-подобных операционных систем для поиска используется программа, или утилита, find. С ее помощью можно гибко настроить критерии поиска, при необходимости выполнить какое-либо действие с найденными объектами. Понятно, что синтаксис команды find сложен, используется множество ключей и комбинаций параметров. Здесь мы рассмотрим несколько примеров использования find . Полную информацию можно получить, воспользовавшись справочной системой Linux.
В простом случае команда find имеет такой синтаксис:
find место_поиска ключ-свойство значение_свойства
На скрине место поиска обведено желтой рамкой, пара ключ и значение – оранжевой. В первом случае в каталоге folder ищутся все файлы, которые были изменены ( -mtime ) за последние 10 дней. Во втором случае файлы ищутся по имени ( -name ) в текущем каталоге. Имена файлов должны соответствовать шаблону *2* .
Обратите внимание, утилита find не поддерживает «стандарт команд Bash», согласно которому ключи из целого слова, а не одной буквы, должны начинаться с двух знаков минуса. У find они начинаются с одного.
Если нужно указать несколько каталогов или несколько параметров поиска, это делается перечислением.
Здесь в двух каталогах выполняется поиск файлов png , размер которых больше 5 килобайт. Шаблон записан в кавычках, иначе не работает.
Если с найденными файлами надо что-то сделать, используется ключ -exec .
В примере ищутся файлы, оканчивающиеся на txt . Каждый найденный передается команде cp (файл подставляется на место фигурных скобок). Команда cp копирует файл в каталог Загрузки . Конец аргумента exec обозначается обратным слэшем и точкой с запятой.
Воспользовавшись справочной системой Linux, выясните, какой ключ и как надо использовать для ограничения глубины поиска. Например, надо найти в домашнем каталоге файлы html . При этом во вложенных папках искать не следует.
Курс с ответами к заданиям и дополнительными уроками в PDF
Введение в Linux и Bash. Курс
Поиск в Linux с помощью команды find
Обновлено: 01.02.2022 Опубликовано: 25.07.2016
Утилита find представляет универсальный и функциональный способ для поиска в Linux. Данная статья является шпаргалкой с описанием и примерами ее использования.
Общий синтаксис
— путь к корневому каталогу, откуда начинать поиск. Например, find /home/user — искать в соответствующем каталоге. Для текущего каталога нужно использовать точку «.». — набор правил, по которым выполнять поиск. * по умолчанию, поиск рекурсивный. Для поиска в конкретном каталоге можно использовать опцию maxdepth.
Описание опций
Также доступны логические операторы:
Оператор | Описание |
---|---|
-a | Логическое И. Объединяем несколько критериев поиска. |
-o | Логическое ИЛИ. Позволяем команде find выполнить поиск на основе одного из критериев поиска. |
-not или ! | Логическое НЕ. Инвертирует критерий поиска. |
Полный набор актуальных опций можно получить командой man find.
Примеры использования find
Поиск файла по имени
* в данном примере будет выполнен поиск файла с именем file.txt по всей файловой системе, начинающейся с корня /.
2. Поиск файла по части имени:
* данной командой будет выполнен поиск всех папок или файлов в корневой директории /, заканчивающихся на .tmp
а) Логическое И. Например, файлы, которые начинаются на sess_ и заканчиваются на cd:
find . -name «sess_*» -a -name «*cd»
б) Логическое ИЛИ. Например, файлы, которые начинаются на sess_ или заканчиваются на cd:
find . -name «sess_*» -o -name «*cd»
в) Более компактный вид имеют регулярные выражения, например:
* где в первом поиске применяется выражение, аналогичное примеру а), а во втором — б).
4. Найти все файлы, кроме .log:
* в данном примере мы воспользовались логическим оператором !.
Поиск по дате
1. Поиск файлов, которые менялись определенное количество дней назад:
* данная команда найдет файлы, которые менялись более 60 дней назад.
find . -mmin -20 -mmin +10 -type f
* найти все файлы, которые менялись более 10 минут, но не более 20-и.
2. Поиск файлов с помощью newer. Данная опция доступна с версии 4.3.3 (посмотреть можно командой find —version).
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
* все файлы, к которым обращались с 08.10.2019.
find . -type f -newerat 2019-10-01 ! -newerat 2019-11-01
* все файлы, к которым обращались в октябре.
find . -type f -newerct 2019-09-07
* все файлы, созданные с 07 сентября 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
По типу
Искать в текущей директории и всех ее подпапках только файлы:
* f — искать только файлы.
Поиск по правам доступа
1. Ищем все справами на чтение и запись:
2. Находим файлы, доступ к которым имеет только владелец:
Поиск файла по содержимому
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 /home/user/* -type d -exec chmod 2700 <> \;
* в данном примере мы ищем все каталоги (type 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:
0 0 * * * /bin/find /tmp -mtime +14 -exec rm <> \;
* в данном примере мы удаляем все файлы и папки из каталога /tmp, которые старше 14 дней. Задание запускается каждый день в 00:00.
* полный путь к исполняемому файлу find смотрим командой which find — в разных UNIX системах он может располагаться в разных местах.