Как найти все файлы с расширением linux

На чтение 3 мин Просмотров 4.6к. Обновлено 01.06.2021

Часто мы оказываемся в тупике, когда нам нужно найти все файлы с одинаковыми или разными расширениями. Скорее всего, это произошло с различными пользователями Linux при использовании терминала. Одно дело искать один тип файла или файл, но что вы будете делать, если захотите найти все файлы одновременно? Эта статья приходит на помощь нашим читателям, у которых возникла такая дилемма.

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

Содержание

  1. Команда «Find»
  2. Поиск всех файлов с одним расширением
  3. Поиск файлов с несколькими расширениями
  4. Команда «Locate»
  5. Заключение

Команда «Find»

Одним из самых мощных инструментов поиска файлов в системе Linux является «команда find». Он ищет во всем каталоге файлы и папки, чтобы сопоставить их с выражением пользователя, и выполняет действия с этими файлами. Разрешение файла, размер файла, тип — это некоторые другие факторы, основанные на поиске файлов в Linux. Команду Find также можно комбинировать с другими утилитами, такими как sed или grep. Теперь давайте перейдем к практическому применению команды find.

Найдите синтаксис команды:

find Directory Options Expression

Поиск всех файлов с одним расширением

Чтобы найти все файлы с расширением файла, запишите его путь, чтобы найти команду с параметрами и выражением, указывающим расширение. В приведенном ниже примере мы найдем все файлы с расширением «.txt».

find . -type f -name «*.txt»

«.» в этой команде означает, что этот инструмент найдет все файлы «.txt» в текущем каталоге.

в этой команде означает, что этот инструмент найдет все файлы

в этой команде означает, что этот инструмент найдет все файлы2

в этой команде означает, что этот инструмент найдет все файлы3

Найдите файлы «.exe» в той же команде поиска, добавив расширение как «* exe».

find . -type f -name «*.exe»

Найдите файлы «.exe» в той же команде поиска, добавив расширение

Найдите файлы «.exe» в той же команде поиска, добавив расширение2

Найдите файлы «.exe» в той же команде поиска, добавив расширение3

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

find /etc -type f -name «*.conf»

Файлы конфигурации также являются важной частью любой файловой системы

Файлы конфигурации также являются важной частью любой файловой системы

Файлы конфигурации также являются важной частью любой файловой системы3

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

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

Выполнение приведенной ниже команды приведет к получению файлов с расширениями «.sh» и «.txt».

find . -type f ( -name «*.sh» -o -name «*.txt» )

Выполнение приведенной ниже команды приведет к получению файлов с расширениями

Выполнение приведенной ниже команды приведет к получению файлов с расширениями2

Выполнение приведенной ниже команды приведет к получению файлов с расширениями3

Команда «Locate»

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

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

При поиске файла с определенным расширением, например «.conf», которое рассматривается в нашем случае, добавляется путь к каталогу, в котором будет происходить процесс поиска файлов.

При поиске файла с определенным расширением, например «.conf»

При поиске файла с определенным расширением, например «.conf»

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

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

Найдите файлы конфигурации в текущем рабочем каталоге, используя приведенную ниже команду2

Точно так же вы можете следовать синтаксису команды locate

Точно так же вы можете следовать синтаксису команды locate для поиска всех файлов с любым конкретным расширением, например «.txt».

для поиска всех файлов с любым конкретным расширением, например «.txt»

для поиска всех файлов с любым конкретным расширением, например «.txt»2

Заключение

В этом посте рассматриваются две мощные, но простые утилиты, с помощью которых вы можете найти все файлы с одинаковыми или разными расширениями. Мы предоставили вам фундаментальные концепции, касающиеся команд «найти» и «найти», и показали, как использовать эти два инструмента командной строки 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 г.

I need to find all image files from directory (gif, png, jpg, jpeg).

find /path/to/ -name "*.jpg" > log

How to modify this string to find not only .jpg files?

unutbu's user avatar

unutbu

831k180 gold badges1769 silver badges1658 bronze badges

asked Apr 12, 2010 at 11:07

Kirzilla's user avatar

find /path/to -regex ".*.(jpg|gif|png|jpeg)" > log

answered Apr 12, 2010 at 14:38

Dennis Williamson's user avatar

Dennis WilliamsonDennis Williamson

343k89 gold badges373 silver badges438 bronze badges

1

find /path/to/  ( -iname '*.gif' -o -iname '*.jpg' ) -print0

will work. There might be a more elegant way.

answered Apr 12, 2010 at 11:16

JoseK's user avatar

JoseKJoseK

31.1k14 gold badges104 silver badges131 bronze badges

3

find -E /path/to -regex ".*.(jpg|gif|png|jpeg)" > log

The -E saves you from having to escape the parens and pipes in your regex.

answered May 20, 2014 at 21:21

tboyce12's user avatar

tboyce12tboyce12

1,43114 silver badges28 bronze badges

6

find /path/to/ -type f -print0 | xargs -0 file | grep -i image

This uses the file command to try to recognize the type of file, regardless of filename (or extension).

If /path/to or a filename contains the string image, then the above may return bogus hits. In that case, I’d suggest

cd /path/to
find . -type f -print0 | xargs -0 file --mime-type | grep -i image/

answered Apr 12, 2010 at 11:47

unutbu's user avatar

unutbuunutbu

831k180 gold badges1769 silver badges1658 bronze badges

1

find /path -type f ( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" )

answered Apr 12, 2010 at 11:43

ghostdog74's user avatar

ghostdog74ghostdog74

324k56 gold badges257 silver badges342 bronze badges

4

On Mac OS use

find -E packages  -regex ".*.(jpg|gif|png|jpeg)"

jww's user avatar

jww

96.4k90 gold badges407 silver badges876 bronze badges

answered Oct 29, 2017 at 3:18

7ynk3r's user avatar

7ynk3r7ynk3r

95813 silver badges17 bronze badges

In supplement to @Dennis Williamson ‘s response above, if you want the same regex to be case-insensitive to the file extensions, use -iregex :

find /path/to -iregex ".*.(jpg|gif|png|jpeg)" > log

answered Oct 13, 2015 at 10:01

TCW's user avatar

TCWTCW

1331 silver badge5 bronze badges

find -regex ".*.(jpg|gif|png|jpeg)"

answered Jun 8, 2015 at 10:21

Shrikant's user avatar

ShrikantShrikant

3836 silver badges7 bronze badges

in case files have no extension we can look for file mime type

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }'

where (audio|video|matroska|mpeg) are mime types regex

&if you want to delete them:

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
  rm "$f"
done

or delete everything else but those extensions:

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 !~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
  rm "$f"
done

notice the !~ instead of ~

answered Jul 28, 2018 at 5:42

k. Doe's user avatar

Adding -regextype posix-extended option only worked in my case:

sudo find . -regextype posix-extended -regex ".*.(css|js|jpg|jpeg|png|ico|ttf|woff|svg)" -exec chmod 0640 {} ;

answered Oct 5, 2021 at 15:06

AamirR's user avatar

AamirRAamirR

11.5k4 gold badges57 silver badges72 bronze badges

I want to search for all .conf files in /etc/.

I tried grep -r *.conf /etc, but the result isn’t right.

What am I doing wrong?

Willi Mentzel's user avatar

asked Aug 17, 2013 at 10:51

Adrian George's user avatar

Adrian GeorgeAdrian George

3,2617 gold badges22 silver badges29 bronze badges

Just press Ctrl+Alt+T on your keyboard to open Terminal. When it opens, run the command below:

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

This will list all files with the extension .txt.

The . at the start denotes the current directory. find searches recursively in all the directories below the given path. If you want the search to start somewhere other than the current working directory, specify the path, for example:

find /etc -type f -name "*.conf"

This searches the /etc directory and all its subdirectories for regular files with the .conf extension.

Zanna's user avatar

Zanna

68.8k55 gold badges214 silver badges325 bronze badges

answered Aug 17, 2013 at 10:54

Mitch's user avatar

7

I’d personally use find, but you can glob for these things too:

shopt -s globstar
ls /etc/{,**/}*.conf

And you can use locate and it’s fast but not reliable.

locate '/etc/**.conf'

answered Aug 17, 2013 at 11:20

Oli's user avatar

OliOli

288k117 gold badges677 silver badges832 bronze badges

3

grep searches the contents of files, not the file names.

To find all .conf files in /etc/ you’ll want find:

find /etc -name "*.conf"

Zanna's user avatar

Zanna

68.8k55 gold badges214 silver badges325 bronze badges

answered Aug 17, 2013 at 10:57

user184890's user avatar

How about using a simple ls command:

ls /etc/*.conf

answered Feb 1 at 14:37

Ivan's user avatar

IvanIvan

1112 bronze badges

The following command will return all files and folders ending in .conf:

ls -lR /etc | grep ".conf$"

To find only files, run:

find /etc -type f -name '*.conf'

ggorlen's user avatar

ggorlen

1131 silver badge8 bronze badges

answered Apr 22, 2021 at 14:22

nibble's user avatar

Содержание

Введение
Простой поиск
-name: Поиск по имени
Поиск по расширению
-not: Логическое отрицание
-o: Логическое ИЛИ
Найти и сразу скопировать в текущую директорию
Поиск по типу
Уровни вложенности
Поиск по размеру файла
Поиск по началу имени файла
Поиск по части имени файла
Переместить определённые файлы но не директории
-perm: Поиск по правам доступа
-path: Поиск путей
-prune: Не заходить в директорию
Исключить директорию из поиска
find + sed
find + grep

Введение

find это мощный инструмент для работы с файлами.

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

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

Поиск

Найти и вывести на экран все файлы в директории

find

find .

find . -print

-name: Поиск по имени

Найти по полному имени в текущей директории

find . -name heihei.log

./heihei.log

Если регистр не важен

find . -iname heihei.log

./HeiHei.log

./heihei.log

Поиск по расширению

Найти по расширению файла с помощью wildcard *

Ищем в /usr/share/doc все pdf файлы

find /usr/share/doc -name *.pdf

-not: обратное условие

Найти в текущей директории все файлы кроме php

find . -not -name *.php

find . ! -name *.php

Несколько условий вместе

Логическое и

Найти все файлы, которые начинаются с log но не имеют расширения .txt

find . -name “log*” ! -name *.txt

-o: Логическое или

Найти либо .html либо .php файлы

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

Найти и скопировать

Найти и сразу скопировать в текущую директорию

find /usr/share/doc -name *.pdf -exec cp {} . ;

Найти в текущей директории

find -name *.pdf

Удалить из текущей директории

find -name *.pdf -delete

Поиск по типу

Чтобы найти только

файлы определённого типа

выполните find с опцией type.

Например, что найти все ссылки в директории /etc

find /etc -type l

Подробнее о файлах в Linux читайте в статье

«Типы файлов в Linux»

Уровни вложенности

Найти все ссылки только на верхнем уровне вложенности

find /etc -maxdepth 1 -type l

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

df -h /boot

Filesystem Size Used Avail Use% Mounted on
/dev/sda1 1014M 194M 821M 20% /boot

Найти обычные файлы определённого размера

Чтобы найти обычные файлы нужно использовать
-type f

find /boot -size +20000k -type f

find: ‘/boot/efi/EFI/centos’: Permission denied
find: ‘/boot/grub2’: Permission denied
/boot/initramfs-0-rescue-389ee10be1b38d4281b9720fabd80a37.img
/boot/initramfs-3.10.0-1160.el7.x86_64.img
/boot/initramfs-3.10.0-1160.2.2.el7.x86_64.img

Файлы бывают следующих типов:

– : regular file

d : directory

c : character device file

b : block device file

s : local socket file

p : named pipe

l : symbolic link

Подробности в статье –

«Файлы в Linux»

find /boot -size +10000k -type f

find: ‘/boot/efi/EFI/centos’: Permission denied
find: ‘/boot/grub2’: Permission denied
/boot/initramfs-0-rescue-389ee10be1b38d4281b9720fabd80a37.img
/boot/initramfs-3.10.0-1160.el7.x86_64.img
/boot/initramfs-3.10.0-1160.el7.x86_64kdump.img
/boot/initramfs-3.10.0-1160.2.2.el7.x86_64.img
/boot/initramfs-3.10.0-1160.2.2.el7.x86_64kdump.img

То же самое плюс показать размер файлов

find /boot -size +10000k -type f -exec du -h {} ;

find: ‘/boot/efi/EFI/centos’: Permission denied
find: ‘/boot/grub2’: Permission denied
60M /boot/initramfs-0-rescue-389ee10be1b38d4281b9720fabd80a37.img
21M /boot/initramfs-3.10.0-1160.el7.x86_64.img
13M /boot/initramfs-3.10.0-1160.el7.x86_64kdump.img
21M /boot/initramfs-3.10.0-1160.2.2.el7.x86_64.img
14M /boot/initramfs-3.10.0-1160.2.2.el7.x86_64kdump.img

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

Обратите внимание, что в find, в отличие от

grep
, ставить перед началом
названия никаких символов не нужно.

find -name topb*

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

Найти в проекте

topbicyle

все директории с qa в названии

find topbicycle/ -name *qa* -type d

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

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

find -maxdepth 1 -type f -name sub* -exec mv {} subprocess ;

-perm: поиск по правам доступа

find . -type f -perm 0600

find . -type f ! -perm 0600

-path: поиск путей

Если мне нужно посмотреть содержимое директорий

/code/php

и

/code/python

find . -path “./code/p*”

Пример укороченного результата

./code/python
./code/python/paramiko/errors/index.php
./code/python/paramiko/models
./code/python/paramiko/index.php
./code/python/ve
./code/python/ve/index.php
./code/python/datetime.php

./code/php

./code/php/mobile_headers.php
./code/php/external_func.php
./code/php/json_decode.php
./code/php/index.php
./code/php/random_int.php
./code/php/check_http_user_agent.php

-prune: ограничить глубину

С помощью
path
можно посмотреть содержимое всех поддиректорий code на букву p

/code/p*

Если нужно посмотреть только поддиректории верхнего уровня – используется -prune

find . -path “./code/p*” -prune

./code/python
./code/php

Получили только поддиректории без их содержимого

Исключить директорию из поиска

Из предыдущего параграфа понятно, что с помощью
prune
можно исключить директорию из поиска.

Пример: найти в ./code все файлы, заканчивающиеся на index.php
но проигнорировать поддиректории на p, то есть в директориях python и php не искать.

find ./code -path “./code/p*” -prune -false -o -name “*index.php”

./code/js/errors/index.php
./code/js/index.php
./code/c/index.php
./code/cpp/index.php
./code/go/pointers/index.php
./code/go/declare_variable/index.php
./code/go/constants/index.php
./code/go/index.php
./code/java/index.php
./code/dotnet/index.php
./code/ruby/index.php
./code/theory/index.php
./code/index.php

-false нужен чтобы не выводить проигнорированные директории.

Ещё один способ исключить директорию из поиска

find ./code -name *.php -not -path “./code/p*”

find + sed

К результатам команды find можно сразу же применить

sed

find . -type f -name *.php -exec sed -i s@python/old_file_name.php@python/new_directory/new_name.php@ {} ;

. означает, что ищем в текущей директории (и вложенных)

Эта команда заменяет везде

python/old_file_name.php

на

python/new_directory/new_name.php

Следующий пример

find . -type f -name *.php -exec sed -n //i/aws/oauth.php/ p {} ;

Эта команда ищет по всем .php файлам строку /i/aws/oauth.php

Если нужно не найти или заменить строку а показать название файла, в котором есть определённые символы
– удобно воспользоваться связкой find + grep

Добавить в функцию my_function дополнительный аргумент – сразу в всех .php файлах.

find -type f -name *.php -exec sed s/my_function($old_arg1, $old_arg2)/my_function($old_arg1, $old_arg2, $new_arg1/ {} ;

find -type f -name *.php -exec sed s/my_function($old_arg1, $old_arg2)/my_function($old_arg1, $old_arg2, $new_arg1/ {} ;

find + grep

К результатам команды find можно сразу же применить

grep

find . -type f -name *.php -exec grep -l /dvps/aws/oauth.php {} ;

Эта команда ищет по всем .php файлам строку /i/aws/oauth.php и показывает в каком
файле встречается эта строка

Похожие статьи

Linux
FAQ
Debian
Ubuntu
CentOS
Rocky
Bash
Настройка сети
Файлы, директории, ссылки…
Изучить свободное место на диске
Объединить .pdf файлы
diff: сравнение файлов
find: поиск файлов
wget: скачивание файлов
kill: завершить процесс
curl
make
signal: системные сигналы
env: переменные окружения
localectl: язык
systemctl: Список активных сервисов
Firewall
SCP: обмен файлами;
SSH: удалённый доступ
cron: задания по расписанию
sudo
Мониторинг ресурсов
C
C++

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