Команда find в linux - описание, опции, примеры
Справка по команде find в Linux для поиска файлов и каталогов.
Примеры поиска
find . -type f -name '*.php' -maxdepth 3 -exec grep 'video-search' {} + ## поиск по названию и содержимому
find ~/ -maxdepth 7 -type f -not -path '*/.*' -not -path '*/node_modules*' -name *.txt ## поиск txt файлов по названию
Синтаксис команды:
find [-H -L -P] [-Oуровень] [-D help|tree|search|stat|rates|opt|exec] [путь...] [выражение]
Опции
Опции команды find:
find ./ -print0 Вывести пути к файлам и символ «NULL» в качестве разделителя.
find ./ -printf '' Форматировать вывод.
find ./ -type ''
Опции -printf:
%p /home/user/Рабочий стол/file.txt Путь к файлу
%h /home/user/Рабочий стол/ Каталог файла
%f file.txt Имя файла
%c Mon Jan 13 16:13:53.8401175430 2020 Дата модификации
%C@ 1578928478.3940218700 секунды.наносекунды с начала эпохи линукс
%Cs 1578928478 секунды с начала эпохи (since 1970-01-01 00:00 GMT)
## Формат опций из команды date:
%TF 2020-01-13 Дата модификации
%TT 16:13:54.0081247250 Время модификации (добавляет nanoseconds)
%TY-%Tm-%Td %TH:%TM:%TS Время создания/модификации файла. Аналог: %CY-%Cm-%Cd %CH:%CM:%CS
%g root Группа владельца
%G 1000 ID группы владельца
%u root Имя пользователя/владельца
%U 1000 ID пользователя/владельца
%m 600 Биты прав доступа
%#m 0600 Биты прав доступа с ведущим "0"
%M -rw------- Права доступа в символьной записи
## @see https://www.gnu.org/software/findutils/manual/html_mono/find.html#Location-Directives
Примечание
Если имена файлов могут содержать пробелы - нужно указывать опцию -print0:
find ./ -print0 | xargs -0
find ./ -print0 выводить полные имена файлов и символ «NULL» в качестве разделителя
xargs -0 задать символ "NULL" в качестве разделителя. По умолчанию "пробел" или "перенос строки"
Примеры
По типу
Поиск файлов по типу:
find ./ -type f # Файлы. Типы файлов: f - файл, d - directory, l - link, p - pipe/канал, s - socket
find ./ -type d # Каталоги
По названию
Шаблон имени:
find /public -name '*js'
Поиск файла по маске содержимого (regex):
// BASH CODE
Формат вывода
find ./ -type f -printf '"%p" %Cs\n' # Вывести полный путь и timestamp модификации
По времени/дате
Время обращения/модификации файла в минутах:
find ./ -amin -30 # время последнего обращения менее 30 мин назад (access time)
find ./ -cmin -30 # время последнего изменения мета-данных менее 30 мин назад
find ./ -mmin -30 # время последней модификации/создания файла менее 30 мин назад
Время последнего обращения/модификации файла в днях:
find ./ -atime +2 # время последнего обращения к файлу более 2 дней
find ./ -ctime +2 # время последнего изменения владельца или прав доступа в днях
find ./ -mtime +2 # время последнего изменения/создания файла более 2 дней
Новее указанной даты:
find ./ -newermt "2019-10-13 06:47" # время изменения/создания файла больше указанной даты
find ./ ! -newermt '2021-05-27 10:00:00' -print0
find ./ -newerat 2019-10-13 # время обращения к файлу больше указанной даты
Новее даты указанного файла:
find ./ -newer /tmp/sync_timestamp # время изменения/создания файла больше чем дата модификации указанного файла
По размеру
find ./ -size +100к -size -50M # больше 100 Кбайт но меньше 50 Мбайт
find ./ -size -900c # меньше 900 байт
Команды
Примеры команд/операций над найденными файлами:
find some-dir/ -type f -print0 | xargs -0 echo ## Простой пример конвейерной обработки после find
find some-dir/ -type f -print0 | xargs -0 mv -t some-dir/dir ## Переместить только файлы в каталог
find ./some-dir/ -name 'file-mask-*.txt' -exec rm -rf '{}' \ ## Удалить файлы
find ./some-dir/ -name 'file-mask-*.txt' -exec chown www-data {} \; ## Изменить владельца файлов
#find #grep #поиск файлов в linux