Команда для поиска файла ubuntu. Поиск файлов в Linux или Изучаем команду find

Команда find в Linux/FreeBSD. Синтаксис команды find.

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

# find [путь] [опции] [параметры поиска] [действия над файлами]

Путь - где искать файлы, можно использовать список путей через пробел.

Опции - начиная с символа «-», после идет название опции:
-d Поиск в подкаталогах перед поиском в самом каталоге
-L При поиске следовать по символическим ссылкам
-maxdepth N При поиске проверять не более чем N вложенных уровней каталогов
-mindepth N Не проверять вложенные каталоги уровня N и меньше
-mount Не искать в каталогах других файловых систем

Параметры поиска

-atime N Последний раз к файлу обращались N дней назад
-mtime N Последнее изменение файла было N дней назад
-name Шаблон Имя файла (шаблон имени) без указания пути. Рекомендуется всегда заключать шаблон в кавычки
-size [±]N Размер файла равен N блокам, если указано +N, тогда размер файла больше N, -N - меньше. Символ после N означает размер блока. b - 512 байт, с - байт, w - 2 байта, k - килобайт, M - мегабайт, G - гигабайт.
-type N Файл типа N. Наиболее часто используемые значения для N: d - каталог, f - файл.
-user Имя_пользователя Файл принадлежит пользователю с именем Имя_пользователя.

Примеры использования команды find с использованием параметров:

# find . -type f -name "~*" -print

Найти в текущем каталоге обычные файлы (не каталоги), имя которых начинается с символа «~».

# find . -newer file.bak -type f -print

Найти в текущем каталоге файлы, измененные позже, чем файл file.bak.

Операторы
Критерии можно объединять, используя операторы. Ниже приведены операторы в порядке убывания их приоритета.

Короткая форма Длинная форма Описание
!критерий -not Отрицание (возвращает true, если критерий false)
критерий1-a критерий2 -and Оператор И (true, если критерий1 и критерий2 true)
критерий1-o критерий2 -or Оператор ИЛИ (true, если критерий1 или критерий2 true)

В общем случае при использовании операторов критерии проверяются в порядке их приоритета. Изменить порядок можно с помощью скобок. Скобки нужно выделять с помощью обратного слеша.

Примеры использования команды find с использованием операторов

#find . \(-name "%*" -or -name "temp*" \) -type f -print

Найти в текущем каталоге файлы, начинающиеся с символа «%» или c «temp» и являющиеся файлами (-type f ), а не каталогами.

# find . -maxdepth 1 \(\(-size +600M -and -size -1G \) -or -name "*.mpeg" \) -and -type f

Найти в текущем каталоге (не обрабатывая подкаталоги - -maxdeph 1 ) обычные файлы (-file f ) размером больше 600MB и менее 1GB (-size) или файлы имя которых заканчивается на «.mpeg» (-name).

Действия над файлами
Когда выполняется команда find, вы можете выполнять различные действия над найденными файлами. Рассмотрим основные из них.

Exec команда \; - Выполнить команду. Обратите внимание, что после команды ставится обратный слэш и точка с запятой.
-execdir команда \; - То же самое что и exec, но команда вызывается из подкаталога, содержащего текущий файл.
-ok команда \; - То же самое, что и exec, но перед обработкой очередного файла будет выводится запрос на выполнение команды.
-okdir команда \; -То же что ok для execdir.
-print - Вывод имени файла на экран.
-ls - Выполнение команды ls -dils над текущим файлом.

В выполняемых командах вы можете использовать параметр {} в качестве аргумента, который заменяется путем к текущему файлу.

Примеры использования команды find с использованием действий

# find . -size +1000c -type f -ls

Найти в текущем каталоге обычные файлы размером больше 1000 байт и выполнить над ними команду ls -dils (действие ls).

# find . -name "~*" -type f -ok rm {} \;

Найти в текущем каталоге обычные файлы, начинающиеся с символа тильда «~», и для каждого файла выдавать запрос на его удаление (на выполнение команды rm).

ПРИМЕРЫ:

Поиск файлов по их размеру

# find /var/log -name "*.log" -and \(-size +1k -and -size -1000k \) -and -type f -print

Будут найдены и выведены на экран файлы с расширением *.log, размером от 1кб до 1000кб

Поиск файлов по их владельцу и группе

Эта команда найдет все файлы, у которых нет владельца

Параметры -user или -uid позволяют искать файлы по идентификатору пользователя (UID) и по имени пользователя, а параметр -group по имени группы.

# find . -name "*.log" -user root -group root

Найдет все файлы в текущем каталоге с расширением log пользователя root и группы root

# find -user root -o -user www

Найдет все файлы пользователя root или www

Использование регулярных выражений

Утилита find поддерживает регулярные выражения. Сразу приведем пример. Скажем, я хочу найти все файлы, расширения которых.php или.js. Я бы мог выполнить это следующим образом:

# find -regextype posix-egrep -regex ".*(php|js)$"

Это выглядит немного сложно, не так ли? В качестве опровержения укажем, что здесь используется синтаксис egrep (-regextype posix-egrep) , а затем задается регулярное выражение, используемое для поиска. Выражение начинается и заканчивается одиночными кавычками для того, чтобы чтобы сама shell-оболочка не пыталась обработать регулярное выражение. Затем идет выражение.*, где используется универсальный символ, соответствующий любому символу или набору символов. Часть (php|js) говорит о том, что надо искать php или js. Конвейер (|) в этом выражении соответствует логическому выражению "или". Наконец, знак доллара ($), которым заканчивается выражение, говорит о том, что эти расширения мы ищем в конце имени файла. Так что если у вас есть файл с именем js.txt, он не будет соответствовать критерию поиска.

Работа со временем
В утилите find есть все для поиска по времени работы с файлом. Вы можете искать по времени доступа (-atime ), либо по времени последней модификации файла (-mtime), либо по времени последнего его изменения (-ctime ).

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

# find -mtime +2

Если вы хотите искать файлы в определенном диапазоне, вы можете комбинировать варианты. Так команда find -mtime +2 -mtime -5 будет означать "два или более дней назад, но не более чем на пять дней назад".

Работаем с минутами
Иногда вам требуется искать файлы, модифицированные в течение прошедшего дня, а предыдущие варианты поиска не слишком точны для этого. Утилита find хороша тем, что в ней также есть параметры -amin , -cmin и -mmin , которые похожи на ранее рассмотренные параметры, но в них используются минуты, а не дни. Так что если вы хотите посмотреть на то, какие файлы были изменены или к каким из них был доступ в последний день, вы можете использовать эти параметры.

Ограничения на поиск
Иногда утилита find предоставляет больше результатов, чем вам нужно. Вы можете ограничить результаты поиска, выдаваемые утилитой find, указав для этого параметр maxdepth . Например, если вы хотите найти все JavaScript файлы в директории WordPress, вы можете использовать следующую команду:

# find wordpress -name "*js"

Но что, если вы хотите видеть только те JavaScript файлы, которые находятся в директории на самом верхнем уровне? Вы можете ограничить поиск с помощью параметра -maxdepth :

# find wordpress -maxdepth 1 -name "*js"

Поиск будет осуществляться только в директории WordPress, но не в поддиректориях. Если изменить значение -maxdepth на 2, то поиск будет осуществляться в поддиректориях директория WordPress, но не в более глубоких поддиректориях.

Комбинируем утилиту find с другими командами
Теперь, когда вы нашли файлы, которые искали, что вы собираетесь с ними делать? Вы можете использовать в утилите find параметры xargs или -exec , которые позволяют указывать действие, выполняемое над файлами после того, как вы их найдете.

Допустим, вы хотите изменить владельца файла с root на www-data сразу для большого количества файлов. Поиск всех этих файлов является только первым шагом, вам нужно также изменить владельца файла. Делать это вручную по списку, который возвратила утилита find , весьма утомительно. Поэтому для смены владельцев файлов вы можете захотеть воспользоваться параметром -exec :

# find -user root -exec chown www-data {} \;

Сегодня мы рассмотрим нескольно наиболее популярных способов поиска файлов в Linux, используя терминал.

1) find: Для поиска файлов из командной строки вы можете использовать команду “find”. У этой команды следующий синтаксис:

find path criteria action

“path” - Секция для указания директории поиска. Если ничего не указано поиск идет по текущей директории.

“criteria” - Опции поиска.

“action” - Опции, которые влияют на состояние поиска или контролируют его, например,

2) locate: Команда “locate” это альтернатива команде “find -name”. Команда find ищет файлы в выбранной части файловой системы и процесс может быть не очень быстрым. С другой стороны, команда locate ищет файлы в базе данный, созданной специально для этих целей /var/lib/locatedb, что происходит намного быстрее. Для обновления базы используется команда updatedb .

3) whereis: whereis” возвращает место расположения кода (опция -b), ман-страниц (опция -m), и исходные файлы (опция -s) для указанной команды. Если опции не указываются, выводится вся доступная информация. Эта команда быстрее чем “find” но менее полная.

4) which: Команда “which” ищет все пути перечисленные в переменной PATH для указанной команды.

5) type:

При вызове без опций показывает, как имена будут интерпретироваться

при использовании в качестве имени команды. Если использована опция -a , команда type выдает список всех каталогов, где есть выполняемый файл с

соответствующим именем. В список включаются также псевдонимы и функции,

если только не указана опция -p . К

хэшу команд не обращаются, если указана опция -a . Команда type возвращает 0,

если хоть один из аргументов найден, и 1 в противном случае.

Постовой

Explo.ru - все про туризм и отдых: горящие туры и путевки в Турцию, Египет,

В Linux есть очень мощная и полезная команда для поиска файлов — команда find . Она обладает большим количеством возможностей для поиска файлов, однако, иногда вызывает сложности у новичков во многом из-за ее синтаксиса.

Простой пример использования команды find

Для начала рассмотрим простой пример использования команды find для поиска на компьютере файлов с именем config . Мы будем искать файлы config , начиная с корневого каталога / . Для этого вам нужно выполнять команду от имени пользователя root , чтобы иметь достаточно прав доступа, иначе получите сообщения «Permission denied». Итак, выполним команду:

Find / -name config -print

Команда означает следующее: искать файлы с именем config (-name config), начиная с каталога / (первый параметр команды find) и выводить имена файлов на экран (аргумент -print). Отмечу, что поиск рекурсивный, то есть при поиске просматриваются все вложенные директории. Как видите все просто. Теперь рассмотрим синтаксис команды и перейдем к обзору ее основных аргументов.

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

Общий синтаксис команды find , который вы можете найти в справочном руководстве, может показаться не совсем простым, поэтому я приведу более удобный для восприятия:

Find [путь] [опции] [критерии поиска] [действия над файлами]

Путь

В качестве пути для поиска можно использовать как абсолютные, так и относительные пути, а также список путей, разделенных пробелом.

Опции

Опции команды find указываются, начиная с символа «-», за которым следует название опции. Рассмотрим основные опции.

Критерии поиска

У команды find может быть несколько критериев поиска (их также называют tests). Каждый критерий представляет собой определенное условие проверки, которое возвращает либо true либо false . Это можно сравнить с условиями оператора if в программировании. В процессе обработки очередного файла команда find по очереди проверяет каждый критерий, и если очередной критерий возвращает false , тогда команда find переходит к следующему файлу. Критериев у команды find довольно много, мы рассмотрим только некоторые из них.

-atime N Последний раз к файлу обращались N дней назад.
-mtime N Последнее изменение файла было N дней назад.
-name шаблон Имя файла (шаблон имени) без указания пути. Рекомендуется всегда заключать шаблон в кавычки.
-newer другой_файл Файл был изменен позже, чем другой_файл.
-size [±] N Размер файла равен N блокам, если указано +N , тогда размер файла больше N , -N — меньше. Символ после N означает размер блока. b — 512 байт, с — байт, w — 2 байта, k — килобайт, M — мегабайт, G — гигабайт.
-type C Файл типа C . Наиболее часто используемые значения для С: d — каталог, f — файл.
-user Имя_пользователя Файл принадлежит пользователю с именем Имя_пользователя.

Примеры использования команды find с использованием критериев

Найти в текущем каталоге обычные файлы (не каталоги), имя которых начинается с символа «~».

Find . -type f -name "~*" -print

Найти в текущем каталоге файлы, измененные позже, чем файл file.bak .

Find . -newer file.bak -type f -print

Операторы

Критерии можно объединять, используя операторы. Ниже приведены операторы в порядке убывания их приоритета.

В общем случае при использовании операторов критерии проверяются в порядке их приоритета. Изменить порядок можно с помощью скобок. Скобки нужно выделять с помощью обратного слеша.

Примеры использования команды find с использованием операторов

Найти в текущем каталоге файлы, начинающиеся с символа «~» или c «temp» и являющиеся именно обычными файлами (-type f), а не каталогами.

Find . \(-name "~*" -or -name "temp*" \) -type f -print

Найти в текущем каталоге (не обрабатывая подкаталоги — -maxdeph 1) обычные файлы (-file f) размером больше 600 мегабайт и менее 1 гигабайта (-size) или файлы имя которых заканчивающиется на «.mpeg» (-name).

Find . -maxdepth 1 \(\(-size +600M -and -size -1G \) -or -name "*.mpeg" \) -and -type f

Действия над файлами

Когда выполняется команда find , вы можете выполнять различные действия над найденными файлами. Рассмотрим основные из них.

В выполняемых командах вы можете использовать параметр {} в качестве аргумента, который заменяется путем к текущему файлу.

Примеры использования команды find с использованием действий

Найти в текущем каталоге обычные файлы размером больше 1000 байт и выполнить над ними команду ls -dils (действие ls).

Find . -size +1000c -type f -ls

Найти в текущем каталоге обычные файлы, начинающиеся с символа тильда «~», и для каждого файла выдавать запрос на его удаление (на выполнение команды rm).

Find . -name "~*" -type f -ok rm {} \;

Заключение

В заметке мы рассмотрели очень важную и полезную Linux команду find , которая предоставляет практически неограниченные возможности для поиска файлов по многим критериям и шаблонам. А с использованием команд (действий) вы можете искать файлы и выполнять над ними любые операции.

Сразу хочу заметить что существует множество разных способов для реализации поиска в Linux. Сейчас, например очень сильно развивается проект beagle. Но я буду говорить о стандартных методах поиска в Linux и Unix. А именно я хочу описать пользование набором программ findutils.

Из набора программ, содержащихся в этом пакете, нас будет интересовать только find и xargs.
Начнем с find. Команда find представляет собой универсальный инструмент для поиска, она позволяет искать файлы и каталоги, просматривать все каталоги в системе или только заданный, искать на файлы заданную глубину и файлы с указанными атрибутами. Обычно пользователи знают что для поиска в Linux существует команда find, но использования этой команды заканчивается на двух трех известных опциях. Для эффективного же поиска, желательно изучить большинство доступных опций.

Использование:
find [-H] [-L] [-P] [путь...] [выражение]

-P — никогда не следовать символьным ссылкам. Эта опция включена по умолчанию;
-L - следовать символьным ссылкам. При этом команда find показывает информацию о файле, на который указывает данная ссылка.
-H — не следовать символьным ссылкам за исключением когда обрабатываются аргументы командной строки. Информация берется из самой ссылки

Путь по умолчанию: текущий каталог; выражение по умолчанию: -print; выражение может состоять из операторов, опций, тестов и действий:

операторы (в порядке уменьшения приоритета; -and берется по умолчанию, если не дано других):
(EXPR) ! EXPR -not EXPR EXPR1 -a EXPR2 EXPR1 -and EXPR2
EXPR1 -o EXPR2 EXPR1 -or EXPR2 EXPR1 , EXPR2

опции, зависящие от положения (всегда верно): -daystart -follow -regextype

обычные опции:
-depth —help -maxdepth УРОВНИ -mindepth УРОВНИ -mount -noleaf
—version -xdev -ignore_readdir_race -noignore_readdir_race

тесты: (N могут быть +N или -N или N): -amin N -anewer ФАЙЛ -atime N -cmin N
-cnewer ФАЙЛ -ctime N -empty -false -fstype ТИП -gid N -group ИМЯ
-ilname ШАБЛОН -iname ШАБЛОН -inum N -ipath ШАБЛОН -iregex ШАБЛОН
-links N -lname ШАБЛОН -mmin N -mtime N -name ШАБЛОН -newer ФАЙЛ
-nouser -nogroup -path ШАБЛОН -perm [+-]РЕЖИМ -regex ШАБЛОН
-wholename ШАБЛОН -size N -true -type -uid N
-used N -user ИМЯ -xtype

действия: -delete -print0 -printf ФОРМАТ -fprintf ФАЙЛ ФОРМАТ -print
-fprint0 ФАЙЛ -fprint ФАЙЛ -ls -fls ФАЙЛ -prune -quit
-exec КОМАНДА; -exec КОМАНДА {} + -ok КОМАНДА;
-execdir КОМАНДА; -execdir КОМАНДА {} + -okdir КОМАНДА;

Опишем наиболее используемые из них:

- name - поиск файлов, имена которых соответствуют заданному шаблону;
- print — поместить запись полных имен найденных файлов в стандартный поток вывода;
- perm — поиск файлов по режиму доступа;
- user — поиск файлов принадлежащих данному пользователю
-nouser — поиск файлов принадлежащих не существующему пользователю, т.е. которого нет в /etc/passwd;
-group — аналогично с -user, только для группы;
-nougroup — аналогично -nouser, только для несуществующей группы;
- mtime -n (+n) — поиск файлов которые модифицировались менее чем -n или более чем +n дней назад;
- atime — поиск по дате -последнего чтения;
- ctime -последнего изменения атрибутов файла;
- type — поиск указанного типа файлов. Т.е. f — обычный файл, d — каталог и т.д.;
- size n — поиск файлов размером n единиц; единицы: c — байт, k — килобайт, b -блок (в зависимости от системы);
- mount — поиск в текущей файловой системе;
- exec — выполнение команды shell для найденных файлов.

Примеры использования команды find:
$ find /home -user serhiy
Найти все файлы в директории /home и всех поддиректориях принадлежащие пользователю serhiy

$ find ~ -name *.c
В вашей домашней директории найдет все файлы с расширением.с. Например helloworld.c

$ find . -name "*"
В текущем каталоге и его подкаталогах найдет файлы начинающиеся с большой буквы. Заметте что выражение для поиска задано в «…».
Для поиска файлов, которые вы не модифицировали какое-то время, используйте ключ «-mtime», а для файлов, у которых определенное время назад не менялись права доступа, используйте «-ctime». Число после символа «+» задает количество дней (суток). Для того, чтобы узнать какие файлы были модифицированы сегодня, попробуйте:
find . -mtime -1 -print
Эта команда покажет вам, какие файлы были модифицированы за последние сутки. Заметьте, что для указания времени «меньше чем» следует указать знак «-».
$ find /var/www/ -mtime -10
Найти файлы в каталоге /var/www/ и его подкаталогах которые были изменены менее чем 10 дней назад.
$ find /var/www/ -mtime +30 -name "*.php"
Найти все.php файлы в каталоге /var/www/ и его подкаталогах которые были изменены более чем 30 дней назад.
найдем файлы, которые не читали более чем (условие «более чем» задается знаком «+») 30 дней:
find . -atime +30 -print
$ find . -perm 777
Найти все файлы в текущем каталоге, которые имеют права доступа 777.

Я думаю, поняв эти примеры, Вы сможете легко найти нужные вам файлы в Linux. Следующим шагом будет совместное использование find и xargs.

Выше я уже упоминал о опции -exec. С помощью этой опции команда find передает указанному интерпритатору shell все найденный файлы для исполнения, которые обрабатываются один раз. Но могут быть трудности с тем, что длина командной строки может быть ограничена, поэтому если файлов слишком много, система выдаст ошибку. Команда xargs как раз решает эту проблему. Дело в том, что эта команда обрабатывает файлы полученные от find не сразу все, как -exec, а порциями.
Рассмотрим некоторые примеры использования find c xargs:
$ find . -perm 777 | xargs rm
Команда find находит в данном каталоге файлы с атрибутами 777, и команда rm удаляет их.

Или скажем вы хотите найти в домашнем каталоге файл name.c и изменить его права доступа на 777:
$ find ~ -name name.c | xargs chmod 777
И еще один пример поиск в файлах:
$ grep -ri "???" * ,
где ‘???’ — искомое значения

Если вы запустите эту команду от имени непривилегированного пользователя в системном каталоге, то наверняка получите массу сообщений типа:
$ find: ./backup/pgsql: Permission denied
Избавиться от них поможет следующий приём:
$ find ./ -name "milter-spa*" 2>/dev/null
То есть сообщения об ошибках (2 – это дескриптор потока STDERR) мы просто выкидываем, оставляя лишь нормальный вывод STDOUT.
Так же вы можете также удалять файлы, соответствующие критериям поиска или даже применять к ним любую произвольную команду. В этом и заключается мощь утилиты find.
$ find test -nouser -delete
Этой командой мы одним махом удалим все файлы в каталоге test, не имеющие владельца (т.е. UID которых не фигурируют в базе учётных записей). Понятно, что таким образом можно удалить и всё, найденное по критерию -name или любому другому. Будьте осторожны!
$ find ./ -name "*.py" -exec cat {} \;
А так можно вывести на экран содержимое всех скриптов на Python (если точнее, то файлов, имеющих расширение.py). Обратите внимание на непонятную конструкцию «{}» – в процессе выполнения она будет заменена результатом поиска, т.е. cat получит в качестве параметров список соответствующих файлов. Точка с запятой в конце тоже обязательна – это указание для find, что опция exec закончилась. Чтобы «;» не интерпретировалась оболочкой, не забывайте его экранировать.
При необходимости всегда можно воспользоваться богатым набором опций для поиска файлов на основании их временных атрибутов (времени модификации, доступа и т. д.).
$ find ./ -atime +90d -size +20 -exec tar cjf old.tbz2 {} \;
Этой страшной конструкцией мы упакуем в архив все файлы больше 10 килобайт (20 блоков по 512 байт; в GNU-версии утилиты можно указывать размер и непосредственно в кило/мега/гигабайтах), к которым никто не обращался более трёх месяцев.
Критерии поиска могут быть самыми разнообразными – по типу файла (каталог, символическая ссылка, регулярный файл и т. д.), по владельцу и группе (опции -user и -group), по выставленным на файле флагам и правам доступа (-flags и -perm соответственно). Для поиска без учёта регистра символов используйте -iname, в более сложных случаях к вашим услугам опция -regex. Можно даже учитывать тип файловой системы (например, при выполнении какого-то действия не принимать во внимание файлы, доступные через NFS).
Утилита find обладает развитым языком составления выражений, когда различные критерии поиска можно группировать с использованием логических операций (разбор оставлю вам в качестве упражнения):
$ find ./ -iname "qwe*" -and -size +20 -or -name "Qwert"
Показанным выше возможности find не исчерпываются – это всего лишь несколько примеров из возможных. Не поленитесь прочитать справку (man find), особенно обращая внимания на приведённые там примеры. И жить в консоли сразу станет проще, жить станет веселей.

Обновлено: 02.11.2019 Опубликовано: 25.07.2016

Самая универсальная и функциональная команда для поиска в Linux — find. Данная статья представляет из себя шпаргалку с примерами ее использования.

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

find <где искать> <опции>

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

<опции> — набор правил, по которым выполнять поиск.

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

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

Опция Описание
-name Поиск по имени.
-iname Регистронезависимый поиск по имени.
-type

Тип объекта поиска. Возможные варианты:

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

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

Примеры использования find

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

find / -name "file.txt"

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

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

find / -name "*.tmp"

* данной командой будет выполнен поиск всех папок или файлов в корневой директории /, заканчивающихся на .tmp

Найти все файлы или папки, которые начинаются на sess_ и заканчиваются на cd

find . -name "sess_*" -a -name "*cd"

* -a: логическое И, -o: логическое ИЛИ.

Поиск по дате

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

find . -type f -mtime +60

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

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

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 — искать только файлы.

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

Ищем все справами на чтение и запись:

find / -perm 0666

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

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 /home/user/* -type d -exec chmod 2700 {} \;

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

Чистка по расписанию

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

Открываем на редактирование задания cron:

И добавляем:

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

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