Во время работы в любой операционной системе иногда возникает потребность в использовании инструментов для быстрого поиска того или иного файла. Актуально это и для Linux, поэтому ниже будут рассмотрены все возможные способы поиска файлов в этой ОС. Представлены будут как инструменты файлового менеджера, так и команды, используемые в «Терминале» .

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

find путь опция

где путь - это директория, в которой будет происходить поиск. Есть три основных варианта указания пути:

  • / — поиск по корневой и прилегающим к ней директориям;
  • ~ — поиск по домашней директории;
  • ./ — поиск в директории, в которой пользователь находится в настоящий момент.

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

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

  • -name - проводить поиск, беря за основу имя искомого элемента;
  • -user - искать файлы, которые относятся к определенному пользователю;
  • -group - проводить поиск по определенной группе пользователей;
  • -perm - показывать файлы с указанным режимом доступа;
  • -size n - искать, беря за основу размер объекта;
  • -mtime +n -n - проводить поиск файлов, которые изменялись более (+n ) или менее (-n ) дней назад;
  • -type - искать файлы определенного типа.

Типов искомых элементов тоже много. Вот их список:

  • b - блочный;
  • f - обычный;
  • p - именованный канал;
  • d - каталог;
  • l - ссылка;
  • s - сокет;
  • c - символьный.

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

Способ 1: Поиск по имени (опция -name)

Чаще всего пользователи для осуществления поиска по системе используют опцию -name , так что именно с нее и начнем. Разберем несколько примеров.

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

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

find /home/user/Dropbox -name "*.xlsx" -print

Из ее синтаксиса можно сказать, что поиск проводится в директории «Dropbox» («/home/user/Dropbox» ), а искомый объект должен быть с расширением «.xlsx» . Звездочка свидетельствует о том, что поиск будет проведен по всем файлам этого расширения, не беря во внимание их название. «-print» указывает на то, что результаты поиска будут выведены на экран.

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

Например, вы хотите отыскать в директории «/home» файл с названием «lumpics» , но расширение его неизвестно. В таком случае нужно выполнить следующее:

find ~ -name "lumpics*" -print

Как можно заметить, здесь используется символ «~» , который означает, что поиск будет проходить в домашней директории. После опции «-name» указано имя искомого файла («lumpics*» ). Звездочка в конце означает что поиск будет проходить только по имени, не учитывая расширение.

Поиск по первой букве в имени

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

find / -name "*" -print

Судя по символу «/», что идет сразу после основной команды, поиск будет проведен, начиная с корневого каталога, то есть во всей системе. Далее, часть «*» означает, что искомое слово будет начинаться с определенной буквы. В нашем случае от «g» до «l» .

К слову, если вы знаете расширение файла, то после символа «*» можете его указать. Например, вам надо найти тот же файл, но вы знаете, что он имеет расширение «.odt» . Тогда можно использовать такую команду:

find / -name "*.odt" -print

Способ 2: Поиск по режиму доступа (опция -perm)

Иногда необходимо найти объект, имя которого вы не знаете, но знаете каким режимом доступа он обладает. Тогда вам нужно применять опцию «-perm» .

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

find ~ -perm 775 -print

То есть поиск проводится в домашнем разделе, а искомые объекты будут обладать доступом 775 . Также вы можете перед этим числом прописать символ «-», тогда найденные объекты будут иметь биты разрешений от нуля до указанного значения.

Способ 3: Поиск по пользователю или группе (опции -user и -group)

В любой операционной системе есть пользователи и группы. Если вы хотите найти объект, принадлежащий одной из этих категорий, то для этого можете использовать опцию «-user» или «-group» , соответственно.

Поиск файла по имени его пользователя

Например, вам нужно найти в директории «Dropbox» файл «Lampics» , но вы не знаете как он называется, а знаете только что он принадлежит пользователю «user» . Тогда вам нужно выполнить следующую команду:

find /home/user/Dropbox -user user -print

В данной команде вы указали необходимую директорию (/home/user/Dropbox ), указали что нужно искать файл, принадлежащий пользователю (-user ), и указали, какому именно пользователю этот файл принадлежит (user ).

Поиск файла по названию его группы

Выполнить поиск файла, который принадлежит определенной группе, точно так же просто - вам нужно всего-навсего заменить опцию «-user» на опцию «-group» и указать название этой группы:

find / -groupe guest -print

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

Способ 4: Поиск файла по его типу (опция -type)

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

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

find ~ -type b -print

Соответственно, вы указали что проводите поиск по типу файла, о чем свидетельствует опция «-type» , а далее определили его тип, поставив символ блочного файла — «b» .

Точно так же вы можете вывести на экран все каталоги в нужной директории, вписав в команду символ «d» :

find /home/user -type d -print

Способ 5: Поиск файла по размеру (опция -size)

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

find /home/user/Dropbox -size 120M -print

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

find / -size 120M -print

Если вы знаете размер файла приблизительно, то и на этот случай есть специальная команда. Вам нужно прописать в «Терминале» то же самое, только перед указанием размера файла поставить знак «-» (если нужно найти файлы меньше указанного размера) или «+» (если размер искомого файла будет больше указанного). Вот пример такой команды:

find /home/user/Dropbox +100M -print

Способ 6: Поиск файла по дате изменения (опция -mtime)

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

Допустим, в папке «Изображения» нам нужно найти объекты, которые подвергались изменениям последние 15 суток. Вот что нужно прописать в «Терминале» :

find /home/user/Изображения -mtime -15 -print

Как можно заметить, эта опция показывает не только файлы, изменявшиеся за указанный срок, но и папки. Работает она и в обратную сторону - вы можете найти объекты, которые были изменены позже указанного срока. Для этого нужно перед цифровым значением вписать знак «+» :

find /home/user/Изображения -mtime +10 -print

GUI

Графический интерфейс во многом облегчает жизнь новичкам, которые только установили дистрибутив Linux. Данный метод поиска очень похож на тот, что осуществляется в ОС Windows, хотя и не может дать всех тех преимуществ, что предлагает «Терминал» . Но обо всем по порядку. Итак, рассмотрим, как сделать поиск файлов в Linux, используя графический интерфейс системы.

Способ 1: Поиск через меню системы

Сейчас будет рассмотрен способ поиска файлов через меню системы Linux. Проводимые действия будут выполняться в дистрибутиве Ubuntu 16.04 LTS, однако инструкция общая для всех.

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

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

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

Find / -name config -print

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

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

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

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

Путь

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

Опции

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

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

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

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

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

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

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

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

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

Операторы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

Эта статья — выдержка из книги «Linux&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 найденные файлы могут быть обработаны практически любой системной командой.

Проблема с поиском нужных файлов или папок была, есть, и будет актуальна всегда. Люди постоянно забывают, куда именно они сохранили нужный файл Хрень.doc, или Супер-музня.mp3. Поэтому независимо от вашей операционной системы, поиск файлов или директорий, будет всегда востребован хоть на Linux, на Windows, или MacOS X. Просто инструменты поиска будут разные. Поиск в Linux можно разделить на две категории: графический и консольный. Начнем с гордости всех луниксоидов — с Терминала. Для поиска в 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, которая ищет файлы по имени.
Например, команда:

find ~ Music -name "*.mp3"

произведет поиск всех файлов (символ *), которые имеют расширение.mp3 в папке Music, которая находится в вашей Домашней директории.

find / -name "*.pdf"

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

sudo find / -name "*.pdf"

find ~ -name "Foto*"

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

Ключ `-name’ различает большие и маленькие буквы; для того чтобы во время поиска не обращать внимание на эти критерии, нужно использовать опцию ‘-iname’. Тогда программа найдет все файлы, которые будут состоять из букв: Foto, foto или FOTO.

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

find ~ -name "Foto*" > results.txt

Если вам известно полное имя файла, тогда команда будет следующая:

find / -name .profile

В данном случае будет произведен поиск скрытого файла.profile во всей системе.

Можно произвести поиск файла если известна часть его имени. В таком случае команда будет такой:

find /home/dm/Музыка/Клипы/ -name "*uniform*"

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

find / -name "*"

Данная команда сможет найти все файлы вашей системы, которые начинаются с букв от a до c.

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

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

find . -perm 775

Поиск файлов по пользователю, либо группе.

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

find / -user comp

Эта команда найдет файлы в системе, которые принадлежат пользователю comp.
А для того, чтобы найти файлы, которые принадлежат какой-то определенной группе (например group2), выполним команду:

find / -group group2

Чтобы найти файлы несуществующих пользователей либо групп, нужно использовать опции -nouser и -nogroup:

find / -nouser

find / -nogroup

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

У команды find есть еще одна полезная возможность, можно найти файлы определенного типа. Для этого применим ключ -type. Найдем символические ссылки в каталоге /etc:

find /etc -type l

Найдем список каталогов, которые присутствуют в папке /mnt/raid

find /mnt/raid -type d

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

Ключ -size дает возможность найти файлы нужного вам размера.

find . -size 2000k

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

find . -size -500k

Если вам нужно отыскать файлы с размером более 900 мегабайт, то команда будет следующей:

find / -size +900M

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

Ключ -mtime дает возможность вам отыскать файлы, которые изменялись в какой-то определенный срок времени.
Например, у нас есть задача найти файлы, которые находятся в папке /home/dm/Video , и которые изменялись за последние 10 дней.

find /home/dm/Video -mtime +10

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

find /home/dm/Video -7

В следующей статье я напишу о графических инструментах поиска в Ubuntu Linux.

    Найдите файл по его имени. Такой простейший поиск выполняется при помощи утилиты 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.