Как найти файл через командную строку linux

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

Она используется для поиска файлов и папок через командную строку Linux.

Команда find — одна из самых мощных и широко применимых команд. При этом она крайне объёмная и насчитывает более 50 опций, в которых легко запутаться, особенно в сочетании с командами exec или xargs.

Если вы сисадмин или разработчик, избежать команды find при работе с командной строкой не получится. Так что давайте научимся её не бояться и пользоваться её возможностями в полной мере.

Для этого разберём самые распространённые случаи практического применения команды find. Но для начала покажу вам синтаксис и принцип работы с командой.

Команда find в Linux

Общий синтаксис команды find выглядит так:

find [directory to search] [options] [expression]

Всё, что в квадратных скобках, указывать необязательно. А значит, выполнить команду find можно вообще без опций и параметров. Она выдаст список всех файлов и папок в текущем расположении. Мало полезного, да?

Так что давайте взглянем на параметры подробнее:

  • directory to search (папка поиска) — это расположение, с которого вы хотите начать поиск. Поиск по умолчанию рекурсивный и начинается с текущего расположения.
  • options (опции) содержит указание типа поиска: по имени, типу файла, времени изменения и так далее — тут может быть более 50 вариантов.
  • expression (выражение) содержит поисковый запрос. Если вы ищете файл по имени, параметр expression должен содержать имя файла. Если ищете файлы с именем, соответствующим заданному шаблону, поисковое выражение — это шаблон.

Приведу простой пример:

find . -type f -name myfile

Такая команда выполнит поиск файла (именно файла, не папки) с именем myfile в текущей папке и подпапках. Опция -type f сужает поиск до файлов. Точка (.) указывает на текущую папку.

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

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

Так выполняется поиск файлов и папок по имени:

find . -name SEARCH_NAME

Поскольку тип объекта не указан, команда выполняет поиск и файлов, и папок.

Пример ниже — поиск файлов и папок с именем «mystuff»:

abhishek@LHB:~/Examples$ find -name mystuff
./new/mystuff
./mystuff

Поиск только файлов или только папок

Если нужно искать только файлы, на помощь придёт опция type -f:

find . -type f -name SEARCH_NAME

Тип и имя можно указывать в любом порядке. Возьмём пример выше и ограничим круг поиска файлами:

abhishek@LHB:~/Examples$ find -type f -name mystuff
./mystuff

Если нужно найти папку, укажите тип type -d:

find . -type d -name SEARCH_NAME

Вот пример нашего поиска уже по папкам:

abhishek@LHB:~/Examples$ find -type d -name mystuff
./new/mystuff

Поиск без учёта регистра

Команда find по умолчанию учитывает регистр. Чтобы выполнить поиск по имени файла без учёта регистра, надо ввести опцию -iname вместо -name.

find . -type f -iname SEARCH_NAME

С поиском по папкам (type -d) это тоже работает.

abhishek@LHB:~/Examples$ find -iname mystuff
./new/mystuff
./MyStuff
./mystuff

Скриншот последних трёх примеров:

image

Поиск файлов по расширению (важно)

Одно из самых популярных применений команды find — поиск файлов определённого типа, то есть по заданному расширению.

Скажем, вы хотите найти все файлы С++ в текущих папках. Файлы С++ имеют расширение .cpp, и вот как их можно найти:

find . -type f -name "*.cpp"

С такими опциями команда find найдёт только файлы (-type f) с именами, оканчивающимися на .cpp.

abhishek@LHB:~$ find . -type f -name "*.cpp"
./file.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream2/zstream_test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/zfstream.cpp

При работе с командой find всегда заключайте поисковое выражение в двойные кавычки.

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

Вот что будет, если ввести запрос без кавычек:

find . -type f -name *.cpp

Оболочка распознает подстановочный знак * и заменит его всеми файлами в текущей папке, чьи имена заканчиваются на .cpp.

Это сработает, если такой файл всего один, но если их несколько, оболочка пожалуется на некорректный синтаксис.

image

В нашем случае файл .cpp всего один, и после подстановки команда выглядит так: find . -type f -name file.cpp. Она работает, поскольку file.cpp — корректный поисковый запрос.

А вот файлов .txt в той же папке два, и когда команда расширяется до find . -type f -name another.txt new.txt, выводится предупреждение, потому что поисковых запросов больше одного.

Именно поэтому сам поисковый запрос всегда следует заключать в двойные кавычки.

Поиск нескольких файлов с несколькими расширениями (или условием)

Команда, рассмотренная выше, нужна для поиска файлов по расширению. А что если нужно найти файлы с несколькими разными расширениями?

Вместо того чтобы прогонять команду find несколько раз, введите её один раз с опцией -o, которая работает как логическое условие «или»:

find . -type f -name "*.cpp" -o -name "*.txt" 

Например:

abhishek@LHB:~/Examples$ find . -type f -name "*.txt" -o -name "*.cpp"
./new.txt
./file.cpp
./new/new.txt
./new/dir2/another.txt
./new/dir1/new.txt
./another.txt

Поиск файлов в заданной папке

Все приведённые примеры иллюстрируют поиск в текущей папке, потому что команда включает в себя точку (.).

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

abhishek@LHB:~/Examples$ find ./new -name mystuff
./new/mystuff

Поиск файлов в нескольких папках

Если нужные вам файлы могут находиться в нескольких папках, можно выполнить поиск во всех этих расположениях за один раз. Просто укажите все пути к папкам при введении команды find:

find ./location1 /second/location -type f -name "pattern"

Поиск пустых файлов и папок

Опция -empty позволяет использовать команду find для поиска пустых файлов и папок.

Найти таковые в текущей папке можно следующим образом:

find . -empty

Можно указать тип объектов, чтобы искать только файлы или только папки:

find . -empty -type f

Кроме того, можно в таком режиме искать файлы по имени:

find . -empty -type f -name "*.cpp"

image

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

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

Используется опция -size с аргументом +N для файлов размером более N и -N для файлов размером менее N.

А вот как можно найти файлы точного заданного размера (50 КБ):

find . -size 50k

Так выполняется поиск файлов размером более 1 ГБ в текущей папке:

find . -size +1G

А так — файлов, не превышающих 20 байт:

find . -size -20c

Для поиска файлов размером более 100 МБ, но менее 2ГБ, введите:

find . -size +100M -size -2G

Поиск по размеру тоже можно сочетать с поиском по имени файла. Таким образом, найти в корневом каталоге все файлы размером более 500 МБ с именем, оканчивающимся на .log, можно так:

find / -size +500M -name "*.log"

Для справки:

  • c – байты
  • k – килобайты
  • M – мегабайты
  • G – гигабайты

Поиск недавно изменённых файлов (поиск по времени изменения или создания)

Вы ведь знакомы с параметрами mtime, atime и ctime?

  • Mtime – время последнего изменения файла
  • Ctime – время создания файла
  • Atime – время последнего доступа к файлу

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

Найти все файлы, претерпевшие изменения за последние трое суток (3*24ч), можно так:

find . -type f -mtime -3

А все файлы, созданные пять и более дней назад, ищутся так:

find . -type f -ctime +5

Понимаю, что 24 часа — большой срок. Что если нужно выявить файлы, изменённые всего пару минут назад? Для этого предусмотрены опции mmin, amin и cmin.

Так выглядит команда поиска всех файлов, изменённых за последние пять минут:

find . -type f -mmin -5

image

Можно не только указать имя файла, но и ограничить временной промежуток с двух сторон. Команда ниже выполнит поиск всех файлов .java, изменённых не ранее 30 и не позднее 20 минут назад.

find . -type f -mmin +20 -mmin -30 -name "*.java"

Поиск файлов с определёнными настройками доступа

Надеюсь, вы имеете представление о разрешениях файлов в Linux.

Команда find позволяет выполнить поиск файлов по разрешению и режиму доступа.

find -perm mode

Поищем в текущей папке, к примеру, все файлы с режимом доступа 777:

find . -perm 777

А так можно найти все файлы с правами на чтение и запись для всех типов пользователей (только точное совпадение; файлы с правами на выполнение для всех не отобразятся):

find . -perm a=r+w

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

Можно также найти файлы, принадлежащие определённому пользователю.

Вот как обнаружить в текущей папке все файлы пользователя Джона:

find . -type f -user John

Эта опция сочетается с другими, будь то размер или время и имя файла:

find . -type f -user John -name "*.cpp"

Отключение рекурсивного поиска для поиска только в текущей папке

По умолчанию команда find выполняет поиск во всех подпапках текущего расположения. Если это не требуется, можно ограничить глубину поиска значением «1». Так вы ограничитесь поиском в текущей папке, не залезая в подпапки.

find . -maxdepth 1 -type f -name "*.txt"

image

Исключение папки из поиска

Если нет необходимости производить поиск в той или иной папке, можно исключить её с помощью опций path, prune и логического «или».

find . -path "./directory_exclude/*" -prune -o -name SEARCH_NAME

Будьте внимательны: путь к папке должен оканчиваться на *, затем идёт -prune и только потом -o.

Попросту говоря, при поиске с опцией prune папка, указанная с помощью path, игнорируется. Prune всегда сопровождается флагом -o (логическое «или»), чтобы папки, которые не были исключены, просматривались на наличие искомого объекта.

Дальнейшая работа с результатами команды find: exec и xargs

Итак, мы изучили различные способы поиска файлов по заданным параметрам. Это хорошо. А теперь следующий шаг: рассмотрим, какие действия можно выполнять с результатами команды find.

Например, как найти файлы с именем, соответствующим определённому шаблону, и переименовать их за одно действие? Или выявить и удалить пустые файлы?

Вам уже известно, что в Linux можно использовать перенаправление ввода-вывода, чтобы объединить результаты одной команды с вводом другой. Но с результатами команды find это не сработает — по крайней мере, не напрямую.

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

  • Применить exec
  • Применить xargs

Использование find и exec

Допустим, вам нужен подробный список (ls -l) файлов, найденных командой find. Вот как его получить:

find . -type f -name "*.txt" -exec ls -l {} +

Результат будет таким:

abhishek@LHB:~/Examples$ find . -type f -name "*.txt" -exec ls -l {} +
-rw-rw-r-- 1 abhishek abhishek 39 Oct 13 19:30 ./another.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 15:36 ./new/dir1/new.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 15:36 ./new/dir2/another.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 18:51 ./new/mystuff/new.txt
-rwxrwxrwx 1 abhishek abhishek 35 Oct 13 15:37 ./new/new.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 18:16 ./new.txt

Многие забывают ввести {} + в конце команды exec. Но это необходимо — как и пробел между скобками {} и плюсом +.

Фигурные скобки ссылаются на результат выполнения команды find. Их содержимое может иметь следующий вид: {файл 1, файл 2, файл 3}. Символ + используется как конец команды exec.

Есть ещё один вариант оформления exec:

find . -type f -name "*.txt" -exec ls -l {} ;

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

Преимущество сочетания {} + заключается в меньшем количестве команд ( ls -l file1 file2 file3), тогда как комбинация {} ; запустит цепочку ls -l file1, ls -l file2 и так далее.

Однако сочетание {} ; даёт возможность использовать {} несколько раз в одном и том же выражении exec. Так, приведённая ниже команда переименует все обнаруженные файлы с расширением .old.

find . -type f -name "*.txt" -exec mv {} {}.old ;

Использование команды xargs

Многие пользователи Linux сталкиваются с необходимостью перенаправления ввода-вывода довольно часто. Но команда exec с цепочкой символов {} + кажется им слишком сложной.

И тут на помощь приходит xargs. Нужно просто перенаправить вывод команды find в команду xargs через конвейер.

find . -type f -name "*.txt" | xargs ls -l

image

Синтаксис куда проще, верно? К тому же команда xargs тоже весьма эффективна. Подробнее о ней — в статье по ссылке.

Сочетание команд find и grep

Теперь вы умеете совмещать команду find с xargs и exec, и пора перейти на следующий уровень — объединить find и grep.

Для сисадминов и разработчиков комбинация команд find и grep — одна из самых распространённых и вместе с тем самых полезных.

Команда find находит файлы с именем, соответствующим шаблону, а затем команда grep выполняет поиск по их содержимому.

Например, вам нужно найти все файлы .txt, в которых есть имя «Alice». Объединить команды find и grep можно так:

find . -type f -name "*.txt" -exec grep -i alice {} +

А можно с помощью xargs:

find . -type f -name "*.txt" | xargs grep -i alice

image

Конечно, пример элементарный, но если команда grep вам знакома, можете использовать её на своё усмотрение.

И это далеко не все возможности команды find…

Перечислить все опции и примеры использования команды find практически невозможно. Её возможностям нет границ, но если вы освоите её принципы, она окажется очень кстати во многих ситуациях. Решающий фактор — как сочетается логика действия разных опций и команд.

Надеюсь, моя подборка примеров использования find была для вас полезна. Если у вас есть вопросы или предложения, как сделать эту статью лучше, добро пожаловать в комментарии.


НЛО прилетело и оставило здесь промокоды для читателей нашего блога:

— 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.

— 20% на выделенные серверы AMD Ryzen и Intel Core — HABRFIRSTDEDIC.

Доступно до 31 декабря 2021 г.

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

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

Команда find – это одна из наиболее важных и часто используемых утилит системы Linux. Это команда для поиска файлов и каталогов на основе специальных условий. Ее можно использовать в различных обстоятельствах, например, для поиска файлов по разрешениям, владельцам, группам, типу, размеру и другим подобным критериям.

Утилита find предустановлена по умолчанию во всех Linux дистрибутивах, поэтому вам не нужно будет устанавливать никаких дополнительных пакетов. Это очень важная находка для тех, кто хочет использовать командную строку наиболее эффективно.

Команда find имеет такой синтаксис:

find [папка] [параметры] критерий шаблон [действие]

Папка – каталог в котором будем искать

Параметры – дополнительные параметры, например, глубина поиска, и т д

Критерий – по какому критерию будем искать: имя, дата создания, права, владелец и т д.

Шаблон – непосредственно значение по которому будем отбирать файлы.

Основные параметры команды find

Я не буду перечислять здесь все параметры, рассмотрим только самые полезные.

  • -P – никогда не открывать символические ссылки.
  • -L – получает информацию о файлах по символическим ссылкам. Важно для дальнейшей обработки, чтобы обрабатывалась не ссылка, а сам файл.
  • -maxdepth – максимальная глубина поиска по подкаталогам, для поиска только в текущем каталоге установите 1.
  • -depth – искать сначала в текущем каталоге, а потом в подкаталогах.
  • -mount искать файлы только в этой файловой системе.
  • -version – показать версию утилиты find.
  • -print – выводить полные имена файлов.
  • -type f – искать только файлы.
  • -type d – поиск папки в Linux.

Критерии

Критериев у команды find в Linux очень много, и мы опять же рассмотрим только основные.

  • -name – поиск файлов по имени.
  • -perm – поиск файлов в Linux по режиму доступа.
  • -user – поиск файлов по владельцу.
  • -group – поиск по группе.
  • -mtime – поиск по времени модификации файла.
  • -atime – поиск файлов по дате последнего чтения.
  • -nogroup – поиск файлов, не принадлежащих ни одной группе.
  • -nouser – поиск файлов без владельцев.
  • -newer – найти файлы новее чем указанный.
  • -size – поиск файлов в Linux по их размеру.

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

А теперь давайте рассмотрим примеры find, чтобы вы лучше поняли, как использовать эту утилиту.

1. Поиск всех файлов

Показать все файлы в текущей директории:

find

find .

find . -print

Все три команды покажут одинаковый результат. Точка здесь означает текущую папку. В место неё можно указать любую другую.

2. Поиск файлов в определенной папке

Показать все файлы в указанной директории:

find ./Изображения

Искать файлы по имени в текущей папке:

find . -name "*.png

Поиск по имени в текущей папке:

find . -name "testfile*"

Не учитывать регистр при поиске по имени:

find . -iname "TeStFile*"

3. Ограничение глубины поиска

Поиска файлов по имени в Linux только в этой папке:

find . -maxdepth 1 -name "*.php"

4. Инвертирование шаблона

Найти файлы, которые не соответствуют шаблону:

find . -not -name "test*"

5. Несколько критериев

Поиск командой find в Linux по нескольким критериям, с оператором исключения:

find . -name "test" -not -name "*.php"

Найдет все файлы, начинающиеся на test, но без расширения php. А теперь рассмотрим оператор ИЛИ:

find -name "*.html" -o -name "*.php"

Эта команда найдёт как php, так и html файлы.

6. Тип файла

По умолчанию find ищет как каталоги, так и файлы. Если вам необходимо найти только каталоги используйте критерий type с параметром d. Например:

find . -type d -name "Загрузки"

Для поиска только файлов необходимо использовать параметр f:

find . -type f -name "Загрузки"

6. Несколько каталогов

Искать в двух каталогах одновременно:

find ./test ./test2 -type f -name "*.c"

7. Поиск скрытых файлов

Найти скрытые файлы только в текущей папке. Имена скрытых файлов в Linux начинаются с точки:

find . -maxdepth 1 -type f -name ".*"

8. Поиск по разрешениям

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

find . -type f -perm 0664

Права также можно задавать буквами для u (user) g (group) и o (other). Например, для того чтобы найти все файлы с установленным флагом Suid в каталоге /usr выполните:

sudo find /usr -type f -perm /u=s

Поиск файлов доступных владельцу только для чтения только в каталоге /etc:

find /etc -maxdepth 1 -perm /u=r

Найти только исполняемые файлы:

find /bin -maxdepth 2 -perm /a=x

9. Поиск файлов в группах и пользователях

Найти все файлы, принадлежащие пользователю:

find . -user sergiy

Поиск файлов в Linux принадлежащих группе:

find /var/www -group www-data

10. Поиск по дате модификации

Поиск файлов по дате в Linux осуществляется с помощью параметра mtime. Найти все файлы модифицированные 50 дней назад:

find / -mtime 50

Поиск файлов в Linux открытых N дней назад:

find / -atime 50

Найти все файлы, модифицированные между 50 и 100 дней назад:

find / -mtime +50 -mtime -100

Найти файлы измененные в течении часа:

find . -cmin 60

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

Найти все файлы размером 50 мегабайт:

find / -size 50M

От пятидесяти до ста мегабайт:

find / -size +50M -size -100M

Найти самые маленькие файлы:

find . -type f -exec ls -s {} ; | sort -n -r | head -5

Самые большие:

find . -type f -exec ls -s {} ; | sort -n | head -5

12. Поиск пустых файлов и папок

find /tmp -type f -empty

find ~/ -type d -empty

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

Для выполнения произвольных команд для найденных файлов используется опция -exec. Например, для того чтобы найти все пустые папки и файлы, а затем выполнить ls для получения подробной информации о каждом файле используйте:

find . -empty -exec ls -ld {} ;

Удалить все текстовые файлы в tmp

find /tmp -type f -name "*.txt" -exec rm -f {} ;

Удалить все файлы больше 100 мегабайт:

find /home/bob/dir -type f -name *.log -size +100M -exec rm -f {} ;

Выводы

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

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Contents

  1. Introduction
  2. The Basics

    1. Locating Files by Name
    2. Locating Files by Size
    3. Locating Files by Access Time
  3. Advanced Usage

    1. Combining Searches
    2. Acting On The files
    3. Using xargs
  4. More Information

Introduction

The GNU find command searches files within a directory and its subdirectories according to several criteria such as name, size and time of last read/write. By default find prints the name of the located files but it can also perform commands on these files.

The GNU find command is part of the GNU findutils and is installed on every Ubuntu system. findutils is actually made up of 4 utilities:

  1. find – search for files in a directory hierarchy, whether its a database or not

  2. locate – list files in databases that match a pattern, i.e. find inside updatedb’s list

  3. updatedb – update a file name database, i.e. collection of db’s only, such as sqlite

  4. xargs – build and execute command lines from standard input – usually you do this directly w/o xargs

This wiki page will be only be dealing with find while also briefly mentioning xargs. Hopefully locate and updatedb will be covered on their own page in the near future. “find”, like “locate”, can find database-files as well, but “locate” is more specialized for this task. You would run updatedb before using locate, which relies on the data produced by “updateDB”.

The Basics

find ~ -name readme.txt 

will find this file below the home directory. find works incredibly fast on the second run! You can search the whole / root-dir-tree in a mere approx. 3 seconds (on second run, when cache is effective) on a 500 GB ext4-fs hard disk.

The syntax for using find is:

find [-H] [-L] [-P] [path...] [expression]

The 3 options [-H] [-L] [-P] are not commonly seen but should at least be noted if only to realise that the -P option will be the default unless another option is specified:

  • -H : Do not follow symbolic links, except while processing the command line arguments.
  • -L : Follow symbolic links.
  • -P : Never follow symbolic links: the default option.

The option [path…] refers to the particular location that you wish to search, whether it be your $HOME directory, a particular directory such as /usr, your present working directory which can simply be expressed as ‘.’ or your entire computer which can be expressed as ‘/’.

The option [expression] refers to one or a series of options which effect the overall option of the find command. These options can involve a search by name, by size, by access time or can also involve actions taken upon these files.

Locating Files by Name

The most common use of find is in the search for a specific file by use of its name. The following command searches the home directory and all of its subdirectories looking for the file mysong.ogg:

find $HOME -name 'mysong.ogg' 

It is important to get into the habit of quoting patterns in your search as seen above or your search results can be a little unpredictable. Such a search can be much more sophisticated though. For example if you wished to search for all of the ogg files in your home directory, some of which you think might be named ‘OGG’ rather than ‘ogg’, you would run:

find $HOME -iname '*.ogg' 

Here the option ‘-iname’ performs a case-insensitive search while the wildcard character ‘*’ matches any character, or number of characters, or zero characters. To perform the same search on your entire drive you would run:

sudo find / -iname '*.ogg' 

This could be a slow search depending on the number of directories, sub-directories and files on your system. This highlights an important difference in the way that find operates in that it examines the system directly each time unlike programs like locate or slocate which actually examine a regularly updated database of filnames and locations.

Locating Files by Size

Another possible search is to search for files by size. To demonstrate this we can again search the home directory for Ogg Vorbis files but this time looking for those that are 100 megabytes or larger:

find $HOME -iname '*.ogg' -size +100M 

There are several options with -size, I have used ‘M’ for ‘megabytes’ here but ‘k’ for ‘kilobytes’ can be used or ‘G’ for ‘Gigabytes’. This search can then be altered to look for files only that are less than 100 megabytes:

find $HOME -iname '*.ogg' -type f -size -100M 

Are you starting to see the power of find, and the thought involved in constructing a focused search? If you are interested there is more discussion of these combined searches in the Advanced Usage section below.

Locating Files by Access Time

It is also possible to locate files based on their access time or the time that they were last used, or viewed by the system. For example to show all files that have not been accessed in the $HOME directory for 30 days or more:

find $HOME -atime +30

This type of search is normally more useful when combined with other find searches. For example one could search for all ogg files in the $HOME directory that have an access time of greater than 30 days:

find $HOME -iname '*.ogg' -atime +30

The syntax works from left to right and by default find joins the 2 expressions with an implied “and”. This is dealt with in more depth in the section below entitled “Combining Searches”.

Advanced Usage

The sections above detail the most common usage of find and this would be enough for most searches. However there are many more possibilities in the usage of find for quite advanced searches and this sections discusses a few of these possibilities.

Combining Searches

It is possible to combine searches when using find with the use of what is known in the find man pages as operators. These are

as in

find ~ -name 'xx*' -and -not -name 'xxx'

unless you prefer the cryptic syntax below (-o instead of -or)

The classic example is the use of a logical AND syntax:

find $HOME -iname '*.ogg' -size +20M 

This find search performs initially a case insensitive search for all the ogg files in your $HOME directory and for every true results it then searches for those with a size of 20 megabytes and over. This contains and implied operator which could be written joined with an -a. This search can be altered slightly by use of an exclamation point to signify negation of the result:

find $HOME -iname '*.ogg' ! -size +20M 

This performs the same search as before but will look for ogg files that are not greater than 20 megabytes. It is possible also to use a logical OR in your find search:

find $HOME -iname '*.ogg' -o -iname '*.mp3'

This will perform a case insensitive search in the $HOME directories and find all files that are either ogg OR mp3 files. There is great scope here for creating very complex and finely honed searches and I would encourage a through reading of the find man pages searching for the topic OPERATORS.

Acting On The files

One advanced but highly useful aspect of find usage is the ability to perform a user-specified action on the result of a find search. For example the following search looks for all ogg vorbis files in the $HOME directory and then uses -exec to pass the result to the du program to give the size of each file:

find $HOME -name '*.ogg' -type f -exec du -h '{}' ;

This syntax is often used to delete files by using -exec rm -rf but this must be used with great caution, if at all, as recovery of any deleted files can be quite difficult.

Using xargs

xargs <<< / ls

same as: ls /

xargs feeds here-string / as parameter (“argument”) to the ls command

When using a really complex search it is often a good idea to use another member of the findutils package: xargs. Without its use the message Argument list too long could be seen signalling that the kernel limit on the combined length of a commandline and its environment variables has been exceeded. xargs works by feeding the results of the search to the subsequent command in batches calculated on the system capabilities (based on ARG_MAX). An example:

find /tmp -iname '*.mp3' -print0 | xargs -0 rm

This example searches the /tmp folder for all mp3 files and then deletes them. You will note the use of both -print0 and xargs -0 which is a deliberate strategy to avoid problems with spaces and/or newlines in the filenames. Modern kernels do not have the ARG_MAX limitation but to keep your searches portable it is an excellent idea to use xargs in complex searches with subsequent commands.

More Information

  • Linux Basics: A gentle introduction to ‘find’ – An Ubuntu Forums guide that was incorporated into this wiki article with the gracious permission of its author.

  • Using Find – Greg’s Wiki – A very comprehensive guide to using find, along similar lines to this guide, that is well worth reading through.

  • Linux Tutorial: The Power of the Linux Find Command The amazing Nixie Pixel gives a video demonstration of find.


CategoryCommandLine

Image

Magnifying glass with blue background

The find command is one of the most useful Linux commands, especially when you’re faced with the hundreds and thousands of files and folders on a modern computer. As its name implies, find helps you find things, and not just by filename.

Whether you’re on your own computer or trying to support someone on an unfamiliar system, here are 10 ways find can help you locate important data.

[ Keep your most commonly used commands handy with the Linux commands cheat sheet. ]

1. Find a single file by name

When you know the name of a file but can’t remember where you saved it, use find to search your home directory. Use 2>/dev/null to silence permission errors (or use sudo to gain all permissions).

$ find / -name "Foo.txt" 2>/dev/null
/home/seth/Documents/Foo.txt

2. Find a single file by approximate name

If you can’t remember the exact name of the file, or you’re not sure whether you capitalized any characters, you can do a partial and case-insensitive search like this:

$ find / -iname "*foo*txt" 2>/dev/null
/home/seth/Documents/Foo.txt
/home/seth/Documents/foo.txt
/home/seth/Documents/foobar.txt

3. Find everything

The ls -R command lists the contents of a directory recursively, meaning that it doesn’t just list the target you provide for it, but also descends into every subdirectory within that target (and every subdirectory in each subdirectory, and so on.) The find command has that function too, by way of the -ls option:

$ find ~/Documents -ls
3554235 0 drwxr-xr-x [...] 05:36 /home/seth/Documents/
3554224 0 -rw-rw-r-- [...] 05:36 /home/seth/Documents/Foo
3766411 0 -rw-rw-r-- [...] 05:36 /home/seth/Documents/Foo/foo.txt
3766416 0 -rw-rw-r-- [...] 05:36 /home/seth/Documents/Foo/foobar.txt

Notice that I don’t use 2>/dev/null in this instance because I’m only listing the contents of a file path within my home directory, so I don’t anticipate permission errors.

4. Find by content

A find command doesn’t have to perform just one task. In fact, one of the options in find enables you to execute a different command on whatever results find returns. This can be especially useful when you need to search for a file by content rather than by name, or you need to search by both.

$ find ~/Documents/ -name "*txt" -exec grep -Hi penguin {} ;
/home/seth/Documents/Foo.txt:I like penguins.
/home/seth/Documents/foo.txt:Penguins are fun.

[ Learn how to manage your Linux environment for success. ]

5. Find files by type

You can display files, directories, symlinks, named pipes, sockets, and more using the -type option.

$ find ~ -type f
/home/seth/.bash_logout
/home/seth/.bash_profile
/home/seth/.bashrc
/home/seth/.emacs
/home/seth/.local/share/keyrings/login.keyring
/home/seth/.local/share/keyrings/user.keystore
/home/seth/.local/share/gnome-shell/gnome-overrides-migrated
[...]

As long as you’re using the GNU version of find, you can include multiple file types in your search results:

$ find ~ -type f,l -name "notebook*"
/home/seth/notebook.org
/home/seth/Documents/notebook-alias.org

6. List just directories

A shortcoming of the ls command is that you can’t filter its results by file type, so it can be noisy if you only want a listing of directories in a path. The find command combined with the -type d option is a better choice:

$ find ~/Public -type d
find ~/Public/ -type d
/home/seth/Public/
/home/seth/Public/example.com
/home/seth/Public/example.com/www
/home/seth/Public/example.com/www/img
/home/seth/Public/example.com/www/font
/home/seth/Public/example.com/www/style

7. Limit listing results

With hundreds of files in a default user directory and thousands more outside of that, sometimes you get more results from find than you want. You can limit the depth of searches with the -maxdepth option, followed by the number of directories you want find to descend into after the starting point:

$ find ~/Public/ -maxdepth 1 -type d
/home/seth/Public/
/home/seth/Public/example.com

8. Find empty files

Sometimes it’s helpful to discover empty files as a way to declutter:

$ find ~ -type f -empty
random.idea.txt

Technically, you can use find to remove empty files, but programmatic removal of files is dangerous. For instance, if you forget to include -type f in a search for empty files, you get directories in your results. By adding a delete flag, you would remove potentially important directory structures.

It’s vital to compose your find command and then verify the results before deleting. Furthermore, a misplaced delete flag in find can delete results before qualifying them (in other words, you can delete directories in a command intended to delete only files by placing the delete flag before the type flag).

I prefer to use xargs or Parallel and a trash command on the rare occasion that I remove files with find.

9. Find files by age

The -mtime option allows you to limit a search to files older than, but also files newer than, some value times 24.

$ find /var/log -iname "*~" -o -iname "*log*" -mtime +30

The + before the -mtime number doesn’t mean to add that number to the time. It’s a conditional statement that matches (in this example) a value greater than 24 times 30. In other words, the sample code finds log files that haven’t been modified in a month or more.

To find log files modified within the past week, you can use the - conditional:

$ find /var/log -iname "*~" -o -iname "*log*" -mtime -7
/var/log/tallylog
/var/log/cups/error_log
/var/log/cups/access_log
/var/log/cups/page_log
/var/log/anaconda/anaconda.log
/var/log/anaconda/syslog
/var/log/anaconda/X.log
[...]

You already know about the -ls flag, so you can combine that with these commands for clarity:

$ find /var/log -iname "*~" -o -iname "*log*" -mtime -7 -ls
-rw-------  1 root root            0 Jun  9 18:20 /var/log/tallylog
-rw-------  1 root lp      332 Aug 11 15:05 /var/log/cups/error_log
-rw-------  1 root lp      332 Aug 11 15:05 /var/log/cups/access_log
-rw-------  1 root lp      332 Aug 11 15:05 /var/log/cups/page_log
-rw-------  1 root root  53733 Jun  9 18:24 /var/log/anaconda/anaconda.log
-rw-------  1 root root 835513 Jun  9 18:24 /var/log/anaconda/syslog
-rw-------  1 root root  21131 Jun  9 18:24 /var/log/anaconda/X.log
[...]

10. Search a path

Sometimes you know the directory structure leading up to a file you need; you just don’t know where the directory structure is located within the system. To search within a path string, you can use the -ipath option, which treats dots and slashes not as regex characters but as dots and slashes.

$ find / -type d -name 'img' -ipath "*public_html/example.com*" 2>/dev/null
/home/tux/Public/public_html/example.com/font

Found it

The find command is an essential tool for a sysadmin. It’s useful when investigating or getting to know a new system, finding misplaced data, and troubleshooting everyday problems. But it’s also just a convenience tool.

[ Download the Linux find cheat sheet to keep all these shortcuts in one place. ]

You don’t need a “good” reason to use find. Using find makes it easier to search for something instead of traversing your system. It’s an understated but infinitely useful tool that embodies the sublime pleasure of everyday Linux. Start using it today, and find out what makes it great.

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

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

Синтаксис
Примеры
    Поиск по имени
    По дате
    По типу файла
    По правам
    По содержимому
    С сортировкой по дате изменения
    Лимиты
    Действия над найденными объектами
Запуск по расписанию в CRON

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

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 или -follow Показывает содержимое символьных ссылок (симлинк).
-empty Искать пустые каталоги.
-delete Удалить найденное.
-ls Вывод как ls -dgils
-print Показать найденное.
-print0 Путь к найденным объектам.
-exec <команда> {} ; Выполнить команду над найденным.
-ok Выдать запрос перед выполнением -exec.

Также доступны логические операторы:

Оператор Описание
-a Логическое И. Объединяем несколько критериев поиска.
-o Логическое ИЛИ. Позволяем команде find выполнить поиск на основе одного из критериев поиска.
-not или ! Логическое НЕ. Инвертирует критерий поиска.

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

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

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

1. Простой поиск по имени:

find / -name “file.txt”

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

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

find / -name “*.tmp”

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

3. Несколько условий. 

а) Логическое И. Например, файлы, которые начинаются на sess_ и заканчиваются на cd:

find . -name “sess_*” -a -name “*cd”

б) Логическое ИЛИ. Например, файлы, которые начинаются на sess_ или заканчиваются на cd:

find . -name “sess_*” -o -name “*cd”

в) Более компактный вид имеют регулярные выражения, например:

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. Поиск файлов с помощью 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

По типу

Искать в текущей директории и всех ее подпапках только файлы:

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 %pn’ | sort -r

* команда найдет все файлы в каталоге /data, добавит к имени дату модификации и отсортирует данные по имени. В итоге получаем, что файлы будут идти в порядке их изменения.

Лимит на количество выводимых результатов

Самый распространенный пример — вывести один файл, который последний раз был модифицирован. Берем пример с сортировкой и добавляем следующее:

find /data -type f -printf ‘%TY-%Tm-%Td %TT %pn’ | 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 . -name “*.tmp” | wc -l

5. Изменить права:

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:

crontab -e

И добавляем:

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

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

Добавить комментарий