Команда find в linux - описание, опции, примеры

Категория: Bash

Справка по команде find в Linux для поиска файлов и каталогов.

Синтаксис команды:

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 . -type f -name '*.php' -maxdepth 3 -exec grep 'video-search' {} +


#find, #поиск файлов в linux

категория: Bash