Как найти файл в Linux. Как искать файлы в Linux с помощью команды find Ubuntu поиск директории

  • 25.01.2022

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ПРИМЕРЫ:

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

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

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

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

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

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

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

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

# find -user root -o -user www

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

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

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

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

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

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

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

# find -mtime +2

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

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

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

# find wordpress -name "*js"

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

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

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

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

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

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

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

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

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

Конечно, поиск файла по имени – самый очевидный способ найти нужный файл.

Для этого используйте:

find -name "query"

Данная команда чувствительна к регистру (то есть, она воспринимает файлы с именем file и File как два разных файла).

Чтобы найти файл по имени без учета регистра, наберите:

find -iname "query"

Чтобы найти файлы, которые не совпадают с определенным шаблоном, нужно инвертировать поиск при помощи флагов -not или метасимвола «!». Обратите внимание, при использовании «!» нужно избегать символов, чтобы оболочка bash не интерпретировала «!» еще до выполнения команды find.

find -not -name "query_to_avoid"

find \! -name "query_to_avoid"

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

При помощи параметра «-type» можно указать тип необходимого файла. Это работает так:

find -type type_descriptor query

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

  • f : обычный файл;
  • d : каталог;
  • l : символическая ссылка;
  • c : символьные устройства;
  • b : блочные устройства.

К примеру, чтобы найти в системе все символьные устройства, нужно выполнить команду:

find / -type c
/dev/parport0
/dev/snd/seq
/dev/snd/timer
/dev/autofs
/dev/cpu/microcode
/dev/vcsa7
/dev/vcs7
/dev/vcsa6
/dev/vcs6
/dev/vcsa5
/dev/vcs5
/dev/vcsa4
. . .

Чтобы найти все файлы, которые заканчиваются на.conf, используйте:

find / -type f -name "*.conf"
/var/lib/ucf/cache/:etc:rsyslog.d:50-default.conf
/usr/share/base-files/nsswitch.conf
/usr/share/initramfs-tools/event-driven/upstart-jobs/mountall.conf
/usr/share/rsyslog/50-default.conf
/usr/share/adduser/adduser.conf
/usr/share/davfs2/davfs2.conf
/usr/share/debconf/debconf.conf
/usr/share/doc/apt-utils/examples/apt-ftparchive.conf
. . .

Фильтрация по времени и размеру

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

Размер файла

Чтобы отфильтровать файлы по размеру, используйте параметр -size.

Также нужно внести суффикс в конце значения, чтобы указать размер:

  • c: байт
  • k: килобайт
  • M: мегабайт
  • G: гигабайт
  • b: блоки по 512 байт

Чтобы найти файлы размером ровно в 50 байт, наберите:

find / -size 50c

Чтобы найти файлы, размер которых меньше 50 байт, используйте символ «-» перед значением:

find / -size -50c

Соответственно, чтобы найти файлы, размер которых превышает 700 мегабайт, используйте перед значением символ +; команда имеет такой вид:

find / -size +700M

Поиск в зависимости от времени

Linux хранит данные о access time, modification time и change time.

  • access time: время последнего обращения к файлу (когда файл был прочитан или дописан);
  • modification time: время последнего изменения содержимого файла;
  • change time: время последнего изменения инода (inode) файла.

Для фильтрации файлов по времени используйте параметры «-atime», «-mtime» и «-ctime» соответственно.

Значение данного параметра указывает, сколько дней назад был изменен файл. Как и в случае с размером файла, можно использовать символы – и +, чтобы получить файлы, измененные меньше чем или больше чем n дней назад.

То есть, чтобы найти файл, содержимое которого было изменено 1 день назад, используйте:

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

find / -atime -1

Чтобы найти файлы, иноды которых были изменены более трех дней назад, введите:

find / -ctime +3

Существуют также сопутствующие параметры, с помощью которых можно указать минуты вместо дней:

Это вернет файлы, содержание которых было изменено минуту назад.

Кроме того, команда find может сравнивать файлы и выводить более новые из них:

find / -newer myfile

Поиск по владельцу и привилегиям

С помощью команды find файлы можно искать по владельцу или правам на файл.

Для того используются параметры –user, –group, и -perm соответственно. Например, чтобы найти файл, принадлежащий пользователю с именем syslog, наберите:

find / -user syslog

Аналогично, чтобы вывести файлы, принадлежащие группе shadow, используйте:

find / -group shadow

Также можно искать файлы с особыми привилегиями.

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

find / -perm 644

Данная строка выведет все файлы с такими правами.

Чтобы вывести все файлы, привилегии которых больше или равны указанным, используйте синтаксис:

find / -perm -644

Это вернет все файлы с дополнительными привилегиями (например, файл с привилегиями 744).

Фильтрация файлов по глубине

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

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

cd
mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
cd ~/test

Чтобы ознакомиться с только что созданной структурой и проверить, все ли создано правильно, используйте команды ls и cd. Затем вернитесь в тестовый каталог test:

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

find -name file1







./level1dir7/level2dir8/level3dir6/file1
./level1dir7/level2dir8/level3dir5/file1

. . .

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

find -name file1 | wc -l
1111

Конечно, в большинстве случаев этот вывод слишком объемный и неудобный. Попробуйте сузить его.

Для этого можно использовать параметр –maxdepth, чтобы задать максимальную глубину поиска:

find -maxdepth num -name query

Чтобы найти file1 в каталогах level1 и выше, укажите максимальную глубину 2 (1 для каталога верхнего уровня и 1 для каталогов level1).

find -maxdepth 2 -name file1
./level1dir7/file1
./level1dir1/file1
./level1dir3/file1
./level1dir8/file1
./level1dir6/file1
./file1
./level1dir2/file1
./level1dir9/file1
./level1dir4/file1
./level1dir5/file1
./level1dir10/file1

Как видите, данный результат имеет гораздо более удобный вид.

Кроме того, можно указать минимальную глубину поиска:

find -mindepth num -name query

Это используется для поиска файлов, которые находятся в конце ветвей каталога:

find -mindepth 4 -name file
./level1dir7/level2dir8/level3dir9/file1
./level1dir7/level2dir8/level3dir3/file1
./level1dir7/level2dir8/level3dir4/file1
./level1dir7/level2dir8/level3dir1/file1
./level1dir7/level2dir8/level3dir8/file1
./level1dir7/level2dir8/level3dir7/file1
./level1dir7/level2dir8/level3dir2/file1
. . .

Опять же, данный результат будет содержать огромное количество файлов (1000).

Максимальную и минимальную глубину поиска можно комбинировать, чтобы уменьшить диапазон поиска:

find -mindepth 2 -maxdepth 3 -name file
./level1dir7/level2dir8/file1
./level1dir7/level2dir5/file1
./level1dir7/level2dir7/file1
./level1dir7/level2dir2/file1
./level1dir7/level2dir10/file1
./level1dir7/level2dir6/file1
./level1dir7/level2dir3/file1
./level1dir7/level2dir4/file1
./level1dir7/file1
. . .

Выполнение и объединение команд

Утилита find позволяет выполнять любую вспомогательную команду на все найденные файлы; для этого используется параметр –exec. Базовый синтаксис выглядит так:

find параметры_поиска -exec команда_и_параметры {} \;

Символы {} используются в качестве заполнителя для найденных файлов. Символы \; используются для того, чтобы find могла определить, где заканчивается команда.

Для примера можно найти файлы с привилегиями 644 (как в предыдущем разделе) и изменить их привилегии на 664:

cd ~/test
find . -perm 644 -exec chmod 664 {} \;

Затем можно сменить привилегии каталога:

find . -perm 755 -exec chmod 700 {} \;

Чтобы связать несколько результатов, используйте команды -and или -or. Команда –and предполагается, если она опущена.

find . -name file1 -or -name file9

Поиск файлов с помощью команды locate

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

Установить эту команду можно при помощи с apt-get:

sudo apt-get update
sudo apt-get install mlocate

Но почему команда locate быстрее, чем find? Дело в том, что locate зависит от базы данных файлов в файловой системе.

Как правило, cron-скрипт обновляет эту базу данных раз в день; но ее можно обновить и вручную. Запустите эту команду:

Запомните: БД нужно регулярно обновлять, чтобы она содержала актуальные данные; в противном случае найти недавно полученные или созданные файлы будет невозможно.

Чтобы найти файлы с помощью команды locate, просто используйте следующий синтаксис:

Полученный результат также можно фильтровать.

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

Чтобы команда locate возвращала только файлы, которые все еще существуют в файловой системе (то есть, файлы, которые не были удалены в промежутке между последним запуском updated и текущим вызовом locate), используйте флаг –е:

Чтобы просмотреть статистику, занесенную командой locate в каталог, используйте опцию –S:

locate -S
Database /var/lib/mlocate/mlocate.db:
3,315 directories
37,228 files
1,504,439 bytes in file names
594,851 bytes used to store database

Итоги

Команды find и locate – отличные инструменты для поиска файлов в UNIX‐подобных операционных системах. Каждая из этих утилит имеет свои преимущества.

Несмотря на то, что команды find и locate сами по себе очень мощны, их действие можно расширить, комбинируя их с другими командами. Научившись работать с find и locate, попробуйте фильтровать их результаты при помощи команд wc, sort и grep.

Tags: ,

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

Поиск по имени

Это наиболее очевидный способ поиска файлов. Для поиска по имени введите:

Find -name "имя"

Этот запрос будет чувствительным к регистру, то есть “file” и “File” будут восприниматься как разные имена.

Для поиска по имени без учёта регистра введите:

Find -iname "имя"

Если вам требуется найти все файлы, не соответствующие определенному шаблону, можно инвертировать поиск при помощи параметра “-not” или “!”. При использовании “!” нужно экранировать символ, чтобы bash не попытался интерпретировать его до начала работы find:

Find -not -name "исключаемое_имя"

Find \! -name "исключаемое_имя"

Поиск по типу

Вы можете указать тип файлов, которые вам нужно найти, при помощи параметра «-type» Это работает следующим образом:

Find -type дескриптор_типа запрос

Вот наиболее распространенные дескрипторы типа:

f: обычный файл
d : директория
l: символическая ссылка
c: символьные устройства
b: блочные устройства

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

А так мы можем выполнить поиск всех файлов, которые заканчиваются на «.conf»:

Find / -type f -name "*.conf"

Поиск по времени и размеру

Find предоставляет ряд способов фильтрации результатов по размеру и времени.

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

Фильтрация по размеру осуществляется при помощи параметра «-size».

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

c: байты
k: килобайты
M: мегабайты
G: гигабайты
b: блоки по 512 байт

Чтобы найти все файлы с размером ровно 100 байт, введите:

Find / -size 100c

Для поиска всех файлов меньше 100 байт мы можем воспользоваться следующей формой:

Find / -size -100c

Для поиска файлов больше 500 мегабайт можно использовать следующую команду:

Find / -size +500M

Поиск по время

Linux хранит данные о времени доступа, времени модификации и времени изменения.

  • Время доступа: время последнего чтения файла или записи в него.
  • Время модификации: время последнего изменения содержимого файла.
  • Время изменения: время последнего изменения метаданных в индексном узле (inode) файла.

Для фильтрации по этим значениям мы можем использовать параметры «-atime», «-mtime» и «-ctime», соответственно, а также символы плюса и минуса для поиска файлов с более ранним или поздним временем, аналогично фильтрации по размеру.

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

Для поиска файлов, содержимое которых было изменено вчера, введите:

Find / -mtime 1

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

Find / -atime -1

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

Find / -ctime +3

Также существуют дополнительные параметры, которые позволяют указывать минуты вместо дней. Эта команда выдает файлы, измененные за последнюю минуту:

Find / -mmin -1

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

Find / -newer myfile

Поиск по владельцу и разрешениям

Используя параметры «-user» и «-group», можно осуществлять поиск файлов по владельцу или группе, соответственно. Чтобы найти файл пользователя «syslog», нужно ввести:

Find / -user syslog

Аналогично можно задать поиск файлов группы «shadow»:

Find / -group shadow

Также можно искать файлы с определенными разрешениями.

Если нам нужно соответствие точному набору разрешений, используется следующая форма:

Find / -perm 644

При необходимости найти все файлы с разрешениями не ниже указанных нужно ввести:

Find / -perm -644

Этому критерию будут соответствовать все файлы с дополнительными разрешениями. Например, в данном случае ему будет соответствовать файл с разрешениями «744».

Фильтрация по глубине

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

Создадим структуру выполнением следующих команд:

Mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10} touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}} cd ~/test

Для проверки структуры можно воспользоваться командами ls и cd. Разобравшись в организации нужно вернуться в тестовую директорию:

Cd ~/test

Теперь попробуем найти в этой структуре конкретные файлы. Начнем с примера обычного поиска по имени:

Find -name file1

Результатов очень много. Если мы переведем вывод на счётчик, мы увидим, что всего таких файлов 1111:

Find -name file1 | wc -l 1111

В большинстве случаев эти результаты избыточны. Давайте попробуем сузить поиск.

Можно задать максимальную глубину поиска в директории поиска верхнего уровня:

Find -maxdepth число -name имя

Чтобы найти «file1» только в директориях «level1» и выше, нужно указать максимальную глубину, равную 2 (1 для директории верхнего уровня и 1 для директорий уровня 1):

Find -maxdepth 2 -name file1

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter .

Эта статья — выдержка из книги «Linux&Unix — программирование в Shell» , Девида Тенсли.

Правки вносил немного в спешке, если замечены опечатки — пишите в комментарии.

Часто в процессе работы возникает необходимость осуществить поиск файлов с определенными характеристиками, такими как права доступа, размер, тип и т.д. Команда find представляет собой универсальный инструмент поиска: она позволяет искать файлы и каталоги, просматривать все каталоги в системе или только текущий каталог.

В этой главе рассматриваются следующие темы, связанные с применением команды find :

Параметры команды find ;

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

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

Возможности команды find обширны, велик и список предлагаемых опций. В настоящей главе описаны наиболее важные из них. Команда find может проводить поиск даже на дисках NFS (Network File System - сетевая файловая система), конечно, при наличии соответствующих разрешений. В подобных случаях команда обычно выполняется в фоновом режиме, поскольку просмотр дерева каталога требует значительных затрат времени. Общий формат команды find таков:

find путевое_имя -опции

где путевое_имя - это каталог, с которого необходимо начинать поиск. Символ ‘.’ служит для обозначения текущего каталога, символ / - корневого каталога, а символ «~» - записанного в переменной $HOME начального каталога текущего пользователя.

2.1. Опции команды find

Остановимся на описании основных опций команды find .

Name Поиск файлов, имена которых соответствуют заданному шаблону

Print Запись полных имен найденных файлов в стандартный поток вывода

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

Prune Применяется для того, чтобы команда find не выполняла рекурсивный поиск по уже найденному путевому имени; если указана опция -depth , опция -prune игнорируется

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

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

Mtime -n +n Поиск файлов, содержимое которых модифицировалось менее чем (-) или более чем (+) n дней назад; имеются также опции -atime и -ctime , которые позволяют осуществлять поиск файлов соответственно по дате последнего чтения и дате последнего изменения атрибутов файла

Nogroup Поиск файлов, принадлежащих несуществующей группе, для которой, иначе говоря, отсутствует запись в файле /etc/groups

Nouser Поиск файлов, принадлежащих несуществующему пользователю, для которого, другими словами, отсутствует запись в файле /etc/passwd

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

Type Поиск файлов определенного типа, а именно: b - специальный блочный файл; d - каталог; с - специальный символьный файл; p - именованный канал; l - символическая ссылка; s - сокет; f - обычный файл

Size n Поиск файлов, размер которых составляет n единиц; возможны следующие единицы измерения: b - блок размером 512 байт (установка по умолчанию); с - байт; k - килобайт (1024 байта); w - двухбайтовое слово

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

F stype Поиск файлов, которые находятся в файловой системе определенного типа; обычно соответствующие сведения хранятся в файле /etc/fstab , который содержит данные о файловых системах, используемых на локальном компьютере

Mount Поиск файлов только в текущей файловой системе; аналогом этой опции является опция -xdev -exec Выполнение команды интерпретатора shell для всех обнаруженных файлов; выполняемые команды имеют формат команда { } ;

(обратите внимание на наличие пробела между символами {} и 😉

Ок Аналогична опции -exec , но перед выполнением команды отображается запрос

2.1.1. Опция -name

При работе с командой find чаще всего используется опция -name . После нее в кавычках должен быть указан шаблон имени файла.
Если необходимо найти все файлы с расширением.txt в вашем начальном каталоге, укажите символ в качестве путевого имени. Имя начального каталога будет извлечено из переменной $HOME .

$ find ~ -name «*.txt» -print

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

$ find . -name «*.txt» -print

Для нахождения в текущем каталоге всех файлов, в именах которых встречается хотя бы один символ в верхнем регистре, введите следующую команду:

$ find . -name «*» -print

Найти в каталоге /etc файлы, имена которых начинаются с символов «host «, позволяет команда

$ find /etc -name «hoat*» -print

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

$ find ~ -name «*.txt» -print -о -name «.*» -print

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

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

$ find / -name «*» -print

Ниже показано, как найти все файлы, в именах которых сначала следуют символы нижнего регистра, а за ними - две цифры и расширение .txt (например, ах37.xt ):

$ find . -name » [а-х] [а-х] . txt» -print

2.1.2. Опция -perm

Опция -perm позволяет находить файлы с заданным режимом доступа. Например, для поиска файлов с режимом доступа 755 (их может просматривать и выполнять любой пользователь, но только владелец имеет право осуществлять запись) следует воспользоваться такой командой:

$ find . -perm 755 -print

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

$ find . -perm -007 -print

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

2.1.3. Опция -prune

Когда вы не хотите вести поиск в том или ином каталоге, воспользуйтесь опцией -prune . Она служит указанием остановить поиск на текущем путевом имени. Если путевое имя указывает на каталог, команда find не будет заходить в него. При наличии опции -depth опция -prune игнорируется.

Следующая команда проводит поиск в текущем каталоге, не заходя в подкаталог /bin:

$ find . -name «bin» -prune -о -print

2.1.4. Опции -user и —nouser

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

$ find ~ -user dave -print

Поиск в каталоге /etc файлов, принадлежащих пользователю uucp , выполняет следующая команда:

$ find /etc -uaer uucp -print

Благодаря опции -nouser возможен поиск файлов, принадлежащих несуществующим пользователям. При ее использовании производится поиск файлов, для владельцев которых нет записи в файле /etc/passwd . Конкретное имя пользователя указывать не нужно: команда find выполняет всю необходимую работу сама. Чтобы найти все файлы, которые принадлежат несуществующим пользователям и находятся в каталоге /home , задайте вот такую команду:

$ find /home -nouaer -print

2.1.5. Опции -group и -nogroup

Опции -group и -nogroup аналогичны опциям -user-nouser/apps всех файлов, которыми владеют пользователи группы accts :

$ find /арра -group accta -print

Следующая команда ищет во всей системе файлы, принадлежащие несуществующим группам:

$ find / -nogroup -print

2.1.6. Опция -mtime

Опцию -mtime следует применять при поиске файлов, доступ к которым осуществлялся х дней назад. Если аргумент опции снабдить знаком ‘-‘, будут отобраны файлы, к которым не было доступа в течение х дней. Аргумент со знаком ‘+’ приводит к противоположному результату - производится отбор файлов, доступ к которым осуществлялся на протяжении последних х дней.

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

$ find / -mtime -5 -print

Ниже приведена команда, выполняющая поиск в каталоге /var/adm файлов, которые обновлялись в течение последних трех дней:

$ find /var/adm -mtime +3 -print

2.1.7. Опция -newer

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

Newer старый_файл ! -newer новый_файл

Знак ‘! ‘ является оператором логического отрицания. Он означает: найти файлы, которые новее, чем старый_файл , но старее, чем новый_файл .

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

Rwxr-xr-x 1 root root 92 Apr 18 11:18 age.awk
-rwxrwxr-x 1 root root 1054 Apr 20 19:37 belts.awk

Для нахождения всех файлов, которые обновлялись позже, чем age.awk , но раньше, чем belts.awk , выполните следующую команду (применение опции -exec описано чуть ниже):

$ find . -newer age.awk ! -newer belts.awk -exec Is -1 {} ;
-rwxrwxr-x 1 root root 62 Apr 18 11:32 ./who.awk
-rwxrwxr-x 1 root root 49 Apr 18 12:05 ./group.awk
-rw-r-r- 1 root root 201 Apr 20 19:30 ./grade2.txt
-rwxrwxr-x 1 root root 1054 Apr 20 19:37 ./belts.awk

Но как быть, если необходимо найти файлы, созданные, скажем, в течение последних двух часов, а у вас нет файла, сформированного ровно два часа назад, с которым можно было бы сравнивать? Создайте такой файл! Для этой цели предназначена команда touch -t , которая создает файл с заданной временной меткой в формате ММДЦччмм (месяц-день-часы-минуты). Например:

$ touch -t 05042140 dstamp
$ ls -1 dstamp
-rw-r-r- 1 dave admin 0 May 4 21:40 dstamp

В результате будет получен файл, дата создания которого - 4 мая, время создания -21:40 (предполагается, что текущее время - 23:40). Теперь можно применить команду find с опцией -newer для нахождения всех файлов, которые обновлялись в течение последних двух часов:

$ find . -newer datamp -print

2.1.8. Опция -type

Операционные системы UNIX и Linux поддерживают различные типы файлов. Поиск файлов нужного типа осуществляется посредством команды, find с опцией -type . Например, для нахождения всех подкаталогов в каталоге /etc воспользуйтесь такой командой:

$ find /etc -type d -print

Чтобы получить список всех файлов, но не каталогов, выполните следующую команду:

$ find . ! -type d -print

Ниже приведена команда, которая предназначена для поиска всех символических ссылок в каталоге /etc .

$ find /etc -type 1 -print

2.1.9. Опция -size

В процессе поиска размер файла указывается с помощью опции -size N , где N - размер файла в блоках по 512 байтов. Возможные аргументы имеют следующие значения: +N - поиск файлов, размер которых больше заданного, -N - меньше заданного, N - равен заданному. Если в аргументе дополнительно указан символ с , то размер считается заданным в байтах, а не в блоках, а если символ k - в килобайтах. Для поиска файлов, размер которых превышает 1 Мб, предназначена команда

$ find . -aize -flOOOk -print

Следующая команда выполняет поиск в каталоге /home/apache файлов, размер которых в точности равен 100 байтам:

$ find /home/apache -sixe 100с -print

Произвести поиск файлов, размер которых превышает 10 блоков (5120 байтов), позволяет приведенная ниже команда:

$ find . -size +10 -print

2.1.10. Опция Опция -depth

Опция -depth позволяет организовать поиск таким образом, что сначала проверяются все файлы текущего каталога (и рекурсивно все его подкаталоги) и только в конце - запись самого каталога. Эта опция широко применяется при создании списка файлов, помещаемых в архив на магнитной ленте с помощью команды cpio или tar , так как в этом случае сначала записывается на ленту образ каталога и лишь после этого задаются права доступа к нему. Это позволяет пользователю архивировать те каталоги, для которых у него нет разрешения на запись.
Следующая команда выводит список всех файлов и подкаталогов текущего каталога:

$ find . -name «*» -print -о -name «.*» -print -depth

Вот как могут выглядеть результаты ее работы:

./.Xdefaults ./.bash_logout ./.bash_profile ./.bashrc ./.bash_nistory ./file ./Dir/filel ./Dir/file2 ./Dir/file3 ./Dir/Subdir/file4 ./Dir/Subdir ./Dir

2.1.11. Опция -mount

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

$ find / -name «*.ХС» -mount -print

2.1.12. Поиск файлов с последующей архивацией командой cpio

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

Вот как выполняется запись на магнитную ленту содержимого каталогов /etc , /home и /apps :

$ cd /
$ find etc home appa -depth -print | cpio -ov > dev/rmtO

Опция команды cpio задает режим записи файлов на ленту. Опция -v (verbose - словесный режим) является указанием команде cpio сообщать о каждом обрабатываемом файле.

Обратите внимание на то, что в именах каталогов отсутствует начальный символ ‘/’. Таким образом задаются относительные путевые имена архивируемых каталогов, что при последующем чтении файлов из архива позволит воссоздавать их в любой части операционной системы, а не только в корневом каталоге.

2.1.13. Опции -exec и -ok

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

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

$ find . -type f -exec Xa -1 (} ;
-rwxr-xr-x 10 root wheel 1222 Jan 4 1993 ./sbin/C80
-rwxr-xr-x 10 root wheel 1222 Jan 4 1993 ./sbin/Normal
-rwxr-xr-x 10 root wheel 1222 Jan 4 1993 ./sbin/Rewid

Здесь выполняется поиск обычных файлов, список которых отображается на экране с помощью команды ls -1.

Чтобы найти файлы, которые не обновлялись в каталоге /logs в течение последних пяти дней, и удалить их, выполните следующую команду:

$ find /log» -type f -mtime +5 -exec rm {} ;

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

$ find . -name «*.LOG» -mtime +5 -ok rm (} ;
< rm … ./nets.LOG > ? у

Для удаления файла введите у , а для предотвращения этого действия - n .

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

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

$ find ~ -print

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

$ find . -type f -perm +4000 -print

Чтобы получить список пустых файлов, воспользуйтесь такой командой:

$ find / -type f -size 0 -exec Is -1 {} ;

В одной из моих систем каждый день создается системный журнал аудита. К имени журнального файла добавляется номер, что позволяет сразу определить, какой файл создан позже, а какой - раньше. Например, версии файла admin.log нумеруются последовательно: admin.log.001, admin.log.002 и т.д. Ниже приведена команда find , которая удаляет все файлы admin.log , созданные более семи дней назад:

$ find /logs -name ‘admin.log.1 -atima +7 exec rm {} ;

2.2. Команда xargs

При наличии опции -exec команда find передает указанной команде все найденные файлы, которые обрабатываются за один раз. К сожалению, в некоторых системах длина командной строки ограниченна, поэтому при обработке большого числа файлов может быть выдано сообщение об ошибке, которое обычно гласит: «Too many arguments» (слишком много аргументов) или «Arguments too long» (слишком большой список аргументов). В этой ситуации на помощь приходит команда xargs . файлы, полученные от команды find , она обрабатывает порциями, а не все сразу.

Рассмотрим пример, в котором команда find возвращает список всех файлов, имеющихся в системе, а команда xargs выполняет для них команду file , проверяющую тип каждого файла:

$ find / -type f -print I xarge.file
/etc/protocols: English text /etc/securetty: ASCII text

Ниже приведен пример, демонстрирующий поиск файлов дампа, имена которых команда echo помещает в файл /tmp/core.log .

$ find / -name core -print | xarge echo > /tmp/core.log

В следующем примере в каталоге /apps/audit выполняется поиск всех файлов, к которым другие пользователи имеют полный доступ. Команда chmod удаляет для них разрешение на запись:

$ find /appe/audit -perm -7 -print | xarge chmod o-w

Завершает наш перечень пример, в котором команда grep ищет файлы, содержащие слово «device «:

$ find / -type f -print | xarge grep «device»

2.3. Заключение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

find / -name "file.txt"

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

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

find / -name "*.tmp"

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

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

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

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

Поиск по дате

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

find . -type f -mtime +60

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

2. Поиск файлов с помощью newer . Данная опция доступна с версии 4.3.3 (посмотреть можно командой find --version ).

а) дате изменения:

find . -type f -newermt "2019-11-02 00:00"

* покажет все файлы, которые менялись, начиная с 02.11.2019 00:00.

find . -type f -newermt 2019-10-31 ! -newermt 2019-11-02

* найдет все файлы, которые менялись в промежутке между 31.10.2019 и 01.11.2019 (включительно).

б) дате обращения:

find . -type f -newerat 2019-10-08

* все файлы, к которым обращались с 08.10.2019.

find . -type f -newerat 2019-10-01 ! -newerat 2019-11-01

* все файлы, к которым обращались в октябре.

в) дате создания:

find . -type f -newerct 2019-09-07

find . -type f -newerct 2019-09-07 ! -newerct "2019-09-09 07:50:00"

* файлы, созданные с 07.09.2019 00:00:00 по 09.09.2019 07:50

По типу

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

* f — искать только файлы.

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

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

find / -perm 0666

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

find / -perm 0600

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

find / -type f -exec grep -i -H "content" {} \;

* в данном примере выполнен рекурсивный поиск всех файлов в директории / и выведен список тех, в которых содержиться строка content .

С сортировкой по дате модификации

find /data -type f -printf "%TY-%Tm-%Td %TT %p\n" | sort -r

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

find /home/user/* -type d -exec chmod 2700 {} \;

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

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

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

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

И добавляем:

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

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