Как найти файл в каталоге и подкаталогах

Обновлено: 06.07.2024

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

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

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

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

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

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

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

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

  • f — файл;
  • d — каталог;
  • l — ссылка;
  • p — pipe;
  • s — сокет.

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

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

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

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

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

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

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

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

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

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

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

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

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

* где в первом поиске применяется выражение, аналогичное примеру а), а во втором — б).

4. Найти все файлы, кроме .log:

* в данном примере мы воспользовались логическим оператором !.

Поиск по дате

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

* все файлы, созданные с 07 сентября 2019 года.

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

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

По типу

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

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

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

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

find / -perm 0666

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

find / -perm 0600

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

find / -type f -exec grep -i -H "content" <> \;

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

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

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

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

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

Поиск с действием (exec)

1. Найти только файлы, которые начинаются на sess_ и удалить их:

find . -name "sess_*" -type f -print -exec rm <> \;

* -print использовать не обязательно, но он покажет все, что будет удаляться, поэтому данную опцию удобно использовать, когда команда выполняется вручную.

2. Переименовать найденные файлы:

find . -name "sess_*" -type f -exec mv <> new_name \;

3. Вывести на экран количество найденных файлов и папок, которые заканчиваются на .tmp:

find . -name "*.tmp" | wc -l

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

find /home/user/* -type d -exec chmod 2700 <> \;

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

5. Передать найденные файлы конвееру (pipe):

* в данном примере мы использовали find для поиска строки test в файлах, которые находятся в каталоге /etc, и название которых заканчивается на .conf. Для этого мы передали список найденных файлов команде grep, которая уже и выполнила поиск по содержимому данных файлов.

6. Произвести замену в файлах с помощью команды sed:

find /opt/project -type f -exec sed -i -e "s/test/production/g" <> \;

* находим все файлы в каталоге /opt/project и меняем их содержимое с test на production.

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

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

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

0 0 * * * /bin/find /tmp -mtime +14 -exec rm <> \;

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


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

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

  • Дате добавления.
  • Содержимому.
  • Регулярным выражениям.

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

  • Управления дисковым пространством.
  • Бэкапа.
  • Различных операций с файлами.

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

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

  • directory-to-search (каталог поиска) – это отправной каталог, с которой find начинает поиск файлов по всем подкаталогам, которые находятся внутри. Если не указать путь, тогда поиск начнется в текущем каталоге;
  • criteria (критерий) – критерий, по которым нужно искать файлы;
  • action (действие) – что делать с каждым найденным файлом, соответствующим критериям.

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

Следующая команда ищет файл s.txt в текущем каталоге:

  • . (точка) – файл относится к нынешнему каталогу
  • -name – критерии по которым осуществляется поиск. В данном случае поиск по названию файла.

В данном случае критерий -name учитывает только символы нижнего регистра и файл S.txt не появиться в результатах поиска. Чтобы убрать чувствительность к регистру необходимо использовать –iname.

Для поиска всех изображений c расширением .jpg нужно использовать шаблон подстановки *.jpg:

Можно использовать название каталога для поиска. Например, чтобы с помощью команды find найти все png изображения в каталоге home:

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

Критерий -type позволяет искать файлы по типу, которые бывают следующих видов:

  • f – простые файлы;
  • d – каталоги;
  • l – символические ссылки;
  • b – блочные устройства (dev);
  • c – символьные устройства (dev);
  • p – именованные каналы;
  • s – сокеты;

Например, указав критерий -type d будут перечислены только каталоги:

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

Допустим, что вам необходимо найти все большие файлы. Для таких ситуаций подойдет критерий -size.

  • "+" — Поиск файлов больше заданного размера
  • "-" — Поиск файлов меньше заданного размера
  • Отсутствие знака означает, что размер файлов в поиске должен полностью совпадать.

В данном случае поиск выведет все файлы более 1 Гб (+1G).

Единицы измерения файлов:

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

Критерий -empty позволяет найти пустые файлы и каталоги.

Поиск времени изменения

Критерий -cmin позволяет искать файлы и каталоги по времени изменения. Для поиска всех файлов, измененных за последний час (менее 60 мин), нужно использовать -60:

Таким образом можно найти все файлы в текущем каталоге, которые были созданы или изменены в течение часа (менее 60 минут).

Для поиска файлов, которые наоборот были изменены в любое время кроме последнего часа необходимо использовать +60.

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

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

Таким образом можно найти файлы, к которым не обращались последние полгода (180 дней).

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

Опция –user username дает возможность поиска всех файлов и каталогов, принадлежащих конкретному пользователю:

Таким образом можно найти все файлы пользователя tisha в каталоге home, а 2>/dev/null сделает выдачу чистой без ошибок в отказе доступа.

Поиск по набору разрешений

Критерий -perm – ищет файлы по определенному набору разрешений.

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

Операторы

Для объединения нескольких критериев в одну команду поиска можно применять операторы:

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

Если файлы могут принадлежать не только пользователю tisha, но и пользователю pokeristo, а также быть размером более 1 Гбайта.

Перед скобками нужно поставить обратный слеш "\".

Действия

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

  • -delete — Удаляет соответствующие результатам поиска файлы
  • -ls — Вывод более подробных результатов поиска с:
    • Размерами файлов.
    • Количеством inode.

    -delete

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

    Перед удалением лучше лишний раз себя подстраховать. Для этого можно запустить команду с действием по умолчанию -print.

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

    • command – это команда, которую вы желаете выполнить для результатов поиска. Например:
      • rm
      • mv
      • cp

      С помощью –exec можно написать альтернативу команде –delete и применить ее к результатам поиска:

      Другой пример использования действия -exec:

      Таким образом можно скопировать все .jpg изображения в каталог backups/fotos

      Заключение

      Команду find можно использовать для поиска:

      • Файлов по имени.
      • Дате последнего доступа.
      • Дате последнего изменения.
      • Имени пользователя (владельца файла).
      • Имени группы.
      • Размеру.
      • Разрешению.
      • Другим критериям.

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

      • Удаление.
      • Копирование.
      • Перемещение в другой каталог.

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

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

      команда dir также может запускаться из консоли восстановления Windows с использованием различных параметров. дополнительные сведения см. в разделе Windows среды восстановления (WinRE).

      Синтаксис

      Параметры

      • d — каталоги
      • h — скрытые файлы
      • s — системные файлы
      • l — точки повторного анализа
      • r — файлы только для чтения
      • a — файлы, готовые к архивации
      • я — нет индексированных файлов содержимого
      • n -в алфавитном порядке по имени
      • e -в алфавитном порядке по расширению
      • сначала группировать каталоги
      • s -по размеру, самый маленький первый
      • d -по дате и времени, сначала старейшие
      • Используйте - префикс, чтобы изменить порядок сортировки на обратный
      • c — создание
      • Последний доступ
      • w — Последнее написанное

      Комментарии

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

      Можно использовать подстановочные знаки (* или ?) для представления одного или нескольких символов имени файла и отображения подмножества файлов или подкаталогов.

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

      dir *.txt Список всех файлов в текущем каталоге с расширениями, которые начинаются с .txt, например .txt,. txt1, .txt_old.

      dir read *.txt Список всех файлов в текущем каталоге, начинающихся с "Read" и с расширениями, которые начинаются с .txt, например .txt, txt1 или .txt_old.

      dir read *.* Перечисляет все файлы в текущем каталоге, которые начинаются с любого расширения.

      Подстановочный знак звездочки всегда использует короткое сопоставление имен файлов, поэтому могут возникнуть непредвиденные результаты. Например, следующий каталог содержит два файла (t. txt2 и t97.txt):

      Можно ожидать, что при вводе dir t97\* будет возвращаться файл t97.txt. Однако ввод dir t97\* возвращает оба файла, так как подстановочный знак звездочки соответствует файлу t. txt2 для t97.txt с использованием его краткого сопоставления имен T97B4

      1.TXT. Аналогичным образом при вводе del t97\* будут удалены оба файла.

      Можно использовать вопросительный знак (?) в качестве замены для одного символа в имени. Например, введите dir read. txt список всех файлов в текущем каталоге с расширением .txt, которые начинаются с Read и следуют до трех символов. Сюда входят Read.txt, Read1.txt, Read12.txt, Read123.txt и Readme1.txt, но не Readme12.txt.

      При использовании параметра/a с более чем одним значением в атрибутах эта команда отображает имена только тех файлов, которые имеют все указанные атрибуты. Например, при использовании /a с атрибутами r и -h (с помощью /a:r-h или /ar-h ) Эта команда отображает только имена нескрытых файлов только для чтения.

      Если указать более одного значения SortOrder , эта команда сортирует имена файлов по первому критерию, затем по второму критерию и т. д. Например, если вы используете /o с параметрами e и -s для SortOrder (с помощью /o:e-s или /oe-s ), эта команда сортирует имена каталогов и файлов по расширению с самым большим первым, а затем отображает окончательный результат. Сортировка по алфавиту по расширению приводит к тому, что имена файлов без расширений отображаются первыми, затем имена каталогов и имена файлов с расширениями.

      При использовании символа перенаправления ( > ) для отправки выходных данных команды в файл или при использовании канала ( | ) для отправки выходных данных команды в другую команду необходимо использовать /a:-d и /b для вывода списка только имен файлов. Можно использовать filename с /b и /s , чтобы указать, что эта команда будет искать в текущем каталоге и его подкаталогах все имена файлов, соответствующие имени файла. Эта команда выводит только имя диска, имя каталога, имя файла и расширение имени файла (по одному пути на строку) для каждого найденного файла. Прежде чем использовать канал для отправки выходных данных команды в другую команду, необходимо задать переменную среды TEMP в файле Autoexec. NT.

      Примеры

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

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

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

      Чтобы напечатать список каталогов, введите:

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

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

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

      Бывает, что вы знаете, что файл или каталог существует, но не знаете, как его найти. Существует несколько команд, которые помогут вам в этом: find , locate и which .

      4.10.1. Команда find

      Команда find имеет следующий формат:

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

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

      Эта команда задает поиск в текущем каталоге всех файлов, содержащих в названии « tes ».

      4.10.2. Команда locate

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

      Команда locate использует базу данных для определения местонахождения файлов или каталогов, содержащих в названии слово dog . Результаты поиска могут включать файл с названием dog , файл с названием bulldog.txt , каталог с названием /dogs/ и так далее. Чтобы узнать больше о команде locate , обратитесь к ее man-странице (введите в командной строке man locate ).

      При условии, что база данных обновлена, команда locate осуществляет поиск очень быстро. Обновление базы данных команды locate происходит каждую ночь при помощи службы cron .

      cron — это небольшая программа, которая запускается в фоновом режиме и выполняет различные задачи (такие как обновление базы данных команды locate ) через определенные промежутки времени. Для доступа к руководству cron наберите в командной строке man cron .

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

      Чтобы обновить базу данных вручную, войдите в систему как root (набрав в командной строке su - и введя пароль root'а) и наберите в командной строке updatedb .

      Через некоторое время база данных slocate , используемая командой locate , обновится.

      Закончив работу, для выполнения которой необходимо быть root'ом, наберите в командной строке exit — вы вернетесь в вашу сессию.

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

      Для получения более подробной информации обратитесь к руководству anacron (набрав в командной строке man anacron ).

      4.10.3. Команда which

      Команда which имеет следующий формат:

      which показывает положение бинарных, или исполняемых файлов. Вывод команды which может быть полезен при создании кнопки запуска приложения. Эта процедура описана в Разд. 2.2.1, Добавление кнопки запуска приложения.

      4.10.4. Команда whereis

      Команда whereis имеет следующий формат:

      покажет положение бинарного файла, исходников и man-страницы команды find :

      4.10.5. Команда whatis

      Команда whatis имеет следующий формат:

      Эта команда показывает информацию о команде из ее man-страницы.

      Если необходимо навести справки о назначении какой-либо команды, использование whatis до обращения к man-странице может сэкономить время.

      Читайте также: