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

21.06.2020

    Найдите файл по его имени. Такой простейший поиск выполняется при помощи утилиты find . Приведенная ниже команда будет искать файл в текущем каталоге и во всех его подкаталогах.

    find -iname "имя файла"

    • Введите -iname вместо -name , чтобы проигнорировать регистр в веденном имени файла. Команда -name учитывает регистр.
  1. Начните поиск в корневом каталоге. Чтобы запустить поиск по всей системе, к запросу добавьте модификатор / . В этом случае команда find будет искать файл во всех каталогах, начиная с корневого.

    find / -iname "имя файла"

    • Можно начать поиск в определенном каталоге; для этого замените / на путь к каталогу, например, /home/max .
    • Можно использовать. вместо / , чтобы искать файл только в текущем каталоге и его подкаталогах.
  2. Используйте символ обобщения . * , чтобы найти файлы, имя которого соответствует части запроса. При помощи символа обобщения * можно найти файл, полное имя которого неизвестно, или найти все файлы с определенным расширением.

    find /home/max -iname "*.conf"

    • Эта команда найдет все файлы с расширением.conf в папке пользователя Max (и ее подпапках).
    • Воспользуйтесь этой командой, чтобы найти все файл, имена которых соответствуют части запроса. Например, если на компьютере хранится множество файлов, связанных с WikiHow, найдите все файлы, введя "*wiki*" .
  3. Облегчите управление результатами поиска. Если результатов поиска слишком много, среди них сложно найти нужный файл. Используйте символ | , чтобы результаты поиска фильтровались командой less. Это облегчит просмотр и фильтрование результатов поиска.

    find /home/max -iname "*.conf" | less

    Найдите конкретные элементы. Используйте модификаторы, чтобы в результатах поиска отобразить только определенные элементы. Можно искать обычные файлы (f), каталоги (d), символьные ссылки (l), устройства посимвольного ввода-вывода (с) и блочные устройства (b).

    find / -type f -iname "имя файла"

  4. Отфильтруйте результаты поиска по размеру файлов. Если на компьютере хранится множество файлов с похожими именами, но размер искомого файла известен, отфильтруйте результаты поиска по размеру файлов.

    find / -size +50M -iname "имя файла"

    • Эта команда найдет все файлы, размер которых превышает 50 МБ. Используйте модификатор + или - , чтобы указать на увеличение или уменьшение размера. Если модификатора + или - нет, команда найдет файлы, размер которых точно совпадает с указанным размером.
    • Результаты поиска можно отфильтровать по байтам (c), килобайтам (k), мегабайтам (M), гигабайтам (G) или блокам по 512 байт (b). Обратите внимание, что приведенные модификаторы учитывают регистр.
  5. Используйте логические операторы (булевы операторы), чтобы объединить поисковые фильтры. Можно использовать операторы -and , -or , -not , чтобы объединить различные поисковые запросы в один запрос.

    find /travelphotos -type f -size +200k -not -iname "*2015*"

    • Эта команда найдет файлы в папке «Travelphotos», размер которых больше 200 кБ и в именах которых нет числа 2015.

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


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


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

Формат команды find :

find путь -опции

где путь - это каталог, в котором произвести поиск. В качестве пути можно указывать следующие значения:

. - поиск в текущем каталоге;

/ - поиск от корневого каталога;

~ - поиск в домашнем каталоге.

Что до опций, то тут гораздо бОльший список, с которым крайне необходимо внимательно ознакомиться (это в будущем очень поможет!). Итак, основные опции команды find :

-name - поиск файлов по имени, используя приведенный шаблон;

-user - поиск файлов, принадлежащих указанному пользователю;

-group - поиск файлов, принадлежащих указанной группе;

-perm - поиск файлов с указанным режимом доступа;

-type - поиск файлов определенного типа. Типов тоже достаточно:

  • b - специальный блочный файл;
  • d - каталог;
  • c - специальный символьный файл;
  • f - обычный файл;
  • l - символическая ссылка;
  • p - именованный канал;
  • s - сокет.
-size n - поиск файлов с размером n единиц;

-mtime -n +n - поиск файлов, содержание которых изменялось менее чем (-) или более чем (+) дней назад.

Рассмотрим некоторые примеры применения команды find :

Наиболее часто применяемой опцией является опция -name , которая производит поиск файлов по имени.

Примеры с опцией -name :

$ find /mnt/usb -name "*.mp3" -print

произведет поиск всех файлов (об этом свидетельствует знак *), имеющих расширение.mp3 на USB-устройстве, смонтированном в каталог /mnt/usb.

$ find ~ -name "test*" -print

выведет на экран список файлов домашнего каталога, начинающихся на test.

Если вам надо найти файлы, начинающиеся с определенных букв (к примеру, от a до j), то здесь будет удобно применить регулярные выражения, которые крайне удобны в работе:

$ find / -name "*" -print

Вышеуказанная команда позволит отыскать все файлы в системе, начинающиеся с букв от a до j.

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

Если потребуется найти файлы, имеющие определенные режимы доступа, вам поможет опция -perm , которая легко в этом поможет.

К примеру, выполним поиск файлов с режимом доступа 775 (владелец и группа имеют полные права и ограничение на запись имеют остальные пользователи), находящихся в текущем каталоге:

$ find . -perm 775 -print

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

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

$ find . -perm -070 -print

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

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

Поиск файлов какого-либо определенного пользователя крайне прост в своей реализации. Для этого достаточно выполнить команду:

$ find / -user admin -print

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

Для того, чтобы найти файлы, принадлежащие определенной группе (к примеру managers), выполним команду:

$ find / -group managers -print

Для поиска файлов несуществующих пользователей или групп можно воспользоваться опциями -nouser и -nogroup :

$ find / -nouser -print

$ find / -nogroup -print

Поиск файлов определенного типа

Одной из удобных возможностей команды find , является возможность поиска файлов определенного типа. Рассмотрим варианты использования опции -type :

Поиск символических ссылок в каталоге /etc:

$ find /etc -type l -print

Вывод на экран списка каталогов, присутствующих в каталоге /mnt/raid

$ find /mnt/raid -type d -print

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

Опция -size позволяет произвести поиск файлов определенного размера и имеет следующий вид при выполнении:

$ find . -size 2000k -print

Вышеуказанная команда отыщет и отобразит на экране файлы размером 2 мегабайта, находящийся в текущем каталоге. Если, к примеру, необходимо найти файлы размером менее 500 килобайт, то вид команды будет следующий:

$ find . -size -500k -print

Если нужно найти файлы размером более 600 мегабайт, то применим команду:

$ find / -size +600M -print

Поиск файлов с использованием опции -mtime

Опция -mtime позволит вам найти файлы, изменявшиеся в какой-то срок времени.

К примеру, у нас встала задача поиска файлов, находящихся в каталоге /mnt/raid/upload , и изменявшихся за последние 5 дней. В этом нам поможет команда:

$ find /mnt/raid/upload -mtime -5 -print

Если нам необходимо обратное, к примеру, отыскать файлы, которые не изменялись неделю, применим команду:

$ find /mnt/raid/upload -7 -print

Команда find является крайне удобным инструментом для поиска файлов и может использоваться также и для поиска файлов на дисках NFS (сетевых файловых системах), но в этом случае необходимо учесть, что времени на поиск чего-либо на NFS уйдет гораздо больше, чем на локальных дисках.

В этой статье мы рассмотрели лишь основные опции команды find, которые помогут вам в вашей работе. Используйте то, что удобно и не переживайте по пустякам!

Вероятно, Вам знакома такая проблема: Есть файл, и Вы не помните, куда его положили.

В этом случае удобна команда find . Как ее использовать? Конечно, к этой утилите поставляется большая man-страница, но мы рассмотрим некоторые типичные случаи. Просмотреть дерево каталогов, начиная с текущего, и найти файл lostfile.txt:

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

Допустимое количество орфографических ошибок зависит от длины имени файла, но может быть установлено с помощью опции -t. Чтобы разрешить максимум 2 ошибки и использовать служебный символ просто наберите:

Обзор дерева каталогов

Иногда необходимо получить обзор дерева каталогов. Например, Вы получили новый CD-ROM и хотели бы узнать, что на нем есть. Вы можете просто использовать ls - R . Лично я для удобочитаемости предпочитаю один из следующих способов. Tree (sunsite.unc.edu/pub/Linux/utils/file/tree-1.2.tgz) отображает дерево каталогов в виде диаграммы.

Или используйте добрый старый find . В Gnu версии find , которая обычно поставляется с Linux, имеется возможность изменить формат вывода, чтобы отображать, например, имя файла и его размер:

Можно воспользоваться небольшой perl процедурой, работающей с командой ls , которая делает подобные вещи. Ее можно загрузить отсюда: lsperl.gz . Существует много других утилит просмотра дерева каталогов, но для большинства случаев этих вполне достаточно.

Поиск файлов по содержанию (поиск текстовых строк в файлах).

Стандартные утилиты для поиска текстовых строк в файлах - grep / egrep для обычных поисков выражения и fgrep для поиска литеральных строк. Чтобы искать выражение во всех файлах в текущем каталоге, просто наберите:

Если Вам трудно запомнить эти длинные команды, используйте маленький скрипт, который можно загрузить отсюда: grepfind.gz . Скрипт еще и удаляет не-печатаемые символы из строки поиска, чтобы Вы случайно не получили в результате поиска egrep -ом двоичный файл.

Очень интересная программа поиска - agrep . Agrep работает в основном подобно egrep , но позволяет искать с учетом орфографических ошибок. Чтобы искать выражение и разрешить максимум 2 орфографические ошибки, наберите:

После этого Вы можете искать строку во всех файлах, которые были предварительно индексированы

glimpse -i -2 "search exprission"

glimpse - тоже допускает орфографические ошибки (как и agrep) и -2 указывает, что разрешены две ошибки. glimpse доступен на

Команда 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 {} \;

Необходимо в каталоге найти файлы содержащие определенную фразу. Как это сделать? Думаю, многие не раз сталкивались с подобной проблемой, как необходимость найти в папке с файлами (а порой и подпапками, в которых тоже хорошо бы поискать) файл, зная кусочек его текста (ну, или догадываясь о нем). Я тоже много раз спотыкался об эту нужда и вот, наконец, собрался и написал небольшой скрипт на bash, выполняющий эту задачу. Не самой общераспространенной задачей, но всё же имеющей место быть, является поиск исполняемого файла программы. Она воспринимает в качестве параметра имя программы, а после выполнения выводит в терминал список с расположением одновременных файлов. Иногда может понадобится найти файл, в котором содержится определённая строчка или найти строку в файле, где есть нужное слово. В Linux всё это делается с помощью одной весьма простой, но в то же время мощной утилиты grep. С её помощью можно искать не только строчки в файлах, но и фильтровать вывод команд, и много чего ещё.

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

Команда grep (расшифровывается как global regular expression print) - одна из самых востребованных команд в терминале Linux, которая входит в состав проекта GNU.

В этом варианте для поиска по содержимому файлов в каталоге можно использовать утилиту grep:

grep -r -n «text» /path

grep -r "Строчка для поиска"
grep -rl $"\xEF\xBB\xBF"

где:
-n показывает строку, где был найден фрагмент;
-r осуществляет розыск рекурсивно, в файлах в самом каталоге /path и в его подкаталогах;

Также можно приплюсовать опцию -C 3, чтобы видеть +- 3 строки вокруг (выше и ниже от найденной).

Дабы найти файл по его содержимому во всех Linux - подобных ОС, достаточно использовать утилиту find.

Linux поиск по содержимому файлов командой find

Своего рода швейцарским ножом в розыске файлов является команда find. Отметим, что она имеет множество опций, которые смогут кардинально изменять механизм поиска. Мы изложим лишь основные принципы, а с остальными способностями ознакомьтесь в справке по команде. Базовый принцип использования find состоит в указании папки поиска и опций. Например, выражение «find ~/ -name *.cpp» осуществит поиск файлов, имеющих продолжение «cpp» по всем каталогам, находящимся в личной директории пользователя.

/usr/bin/find /папка -type f -exec grep -H "строчка для поиска" {} ;

Значение, указанное после опции -name, задает шаблон соотношения имени файла. Вы можете использовать опцию -type для указания типа файла, где в свойстве значений нужно использовать специальные буквы: d - директория, f - файл, l — символическая ссылка и т. д. Функции -user, -group и -size также довольно полезны. Их значениями являются имя пользователя, имя категории и размер файла в байтах.

find /var/www/ -name "file.conf"
find /var/www/ -name "*.conf"

С поддержкою опции -exec каждому файлу, предназначенному для установки соответствия, можно добавить случайную обработку. Таким образом, появляется возможность осуществления поиска, как по имени файла, так и по охватываемому. Ниже приводится пример комбинирования команды find и grep за счет использования функции -exec.

find ~/ -name *.cpp
find ~/ -name *.cpp -user "my-username" -group "my-group"
find ~/ -name "*.config" -type f -exec grep "user" {} \;
find /home/ (-name "*.php" -or -name "*.html" -or -name "*.js")
-exec grep -lHEi $"\xEF\xBB\xBF" {} ;

А возможно и еще проще

Linux поиск по содержимому файлов командой which

Бригада which ищет только те файлы, у которых есть право на выполнение как программы. Розыск осуществляется по директориям, заданным в переменной окружения PATH. Содержимое переменной PATH сможет отличаться для различных пользователей. Чтобы охватить как можно большее количество системных директория, необходимо войти в систему под учетной записью администратора.

which cat
/bin/cat
which docker-stack
/home/username/.local/bin/docker-stack

Linux поиск по содержимому файлов командой locate

Поиск, производимый командой locate весьма быстр. Однако учитывайте тот факт, что системная база данных может быть не живой на момент осуществления операции. Механизм сканирования файловой системы, время его проведения и вобщем наличие такого инструмента может разниться в различных дистрибутивах Linux. Команда locate может быть полезна лишь при поиске файла по его имени. Однако для проверки текстового содержимого документов на вступление искомых данных нужно использовать другой инструмент.

Команда locate представляется альтернативой для find.

Данная команда, как правило, работает быстрее и может с легкостью производить поиск (в широком смысле - стремление добиться чего-либо, найти что-либо; действия субъекта, направленные на получение нового или утерянного (забытого): новой информации (поиск информации), данных,) по всей файловой системы. Linux имеет специальную команду grep, какая принимает шаблон для поиска и имя файла (именованная область данных на носителе информации). В случае нахождения совпадений, они будут выведены в терминал. В всеобщем виде выражение можно составить как «grep шаблон_поиска имя_файла». Чтобы отыскать файлы с помощью команды locate, просто используйте следующий синтаксис:

К образцу, чтобы возвращать только файлы, содержащие сам запрос, вместо того чтобы вводить каждый файл, который содержит запрос в ведущих к нему каталогах, можно утилизировать флаг –b (чтоб искать только basename, базовое имя файла):

Команды find и locate – отличные инструменты для поиска файлов в UNIX‐подобных операционных системах. Любая из этих утилит имеет свои преимущества. Мы рассмотрели использование команд для поиска и фильтрации вывода бригад в операционной системе Linux. При правильном применении эта утилита станет мощным инструментом в ваших руках. Несмотря на то, что команды find и locate сами по себе очень мощны, их действие возможно расширить, комбинируя их с другими командами. Научившись работать с find и locate, попробуйте чистить их результаты при помощи команд wc, sort и grep.

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