Терминал Linux. 2 статья - команда поиска файлов и директорий в терминале


В этой статье поговорим о команде "find" - поиска файлов и директорий в терминале.

Цикл статей о терминале:
  1. Терминал Linux. 1 статья - команды навигации в терминале.

  2. Терминал Linux. 2 статья - команда поиска файлов и директорий в терминале

  3. Терминал Linux. 3 статья - команды поиска файлов (продолжение)

  4. Терминал Linux. 4 статья - создание, удаление, форматирование, монтирование разделов жесткого диска

  5. Терминал Linux. 5 статья - cоздание aliases (псевдонимов) в Ubuntu

  6. Терминал Linux. 6 статья - права доступа к каталогам и файлам в Linux, команды chmod и chown.

  7. Терминал Linux. 7 статья - доступ к sudo без ввода пароля.


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


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

Для поиска файлов в терминале используется команда "find"

Формат команды find:
find путь -опции

путь – это каталог, в котором произвести поиск. 
В обычном случае мы просто указываем путь к нужному каталогу, например:
/usr/share
Но в качестве пути можно указывать следующие значения:
.    – поиск в текущем каталоге;
/   – поиск от корневого каталога;
~  – поиск в домашнем каталоге.

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

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

-type          -  поиск файлов определенного типа. 
Вот наиболее используемые типы:
  • d  – каталог;
  • f   – обычный файл;
  • l   – символическая ссылка;
-size -n +n n      -  поиск файлов с размером n единиц;

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

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

Самый простой поиск, указываем путь и имя файла. 
Например, найдем файл с именем file1
find /home/ -name file1

Но если бы мы написали не полностью имя, например "file", то файл "file1" не был найден. Для этого нужно писать имя в ковычках и в конце добавить *, вот таким образом:
find /home/ -name "file*"

 Но нашлись и файлы и директории, где встречается название file, чтобы разграничить это и используется опция -type и параметр f, чтобы искать только файлы (для только директорий d):
find /home/ -name "file*" -type f

Но теперь нашлись файлы в фиг знает какой глубины директориях. А что если нам надо найти в текущем каталоге или в папках вложенности 1 или 2?
Для этого используется опция maxdepth (глубина поиска), то есть, если мы хотим найти файл в директории поиска, без рекурсивного просмотрах всех директорий:
find ~ -maxdepth 1 -name "file*" -type f

Как видим, что нашлись файлы только в директории поиска.
Если хотим включить первый уровень папок внутри каталога поиска, тогда нужно указать maxdepth 2:
find ~ -maxdepth 2 -name "file*" -type f

Как видно на скриншоте, теперь найден файл и в папке "Загрузки". Просто выставляем параметр опции -maxdepth для установки глубины поиска.
Важно! Нужно указывать его перед опцией -name.

Теперь разберем очень важную опцию поиска файла с размером "-size".
Важно, если мы хотим найти файлы размером в килобайтах, нужно писать в конце k, для мегабайт M, для гигабайт G, для байт b. Важно соблюдать регистр.
Разберем пример:
Найдем файлы в домашней директории менее 10 килобайт с именем file*:
find ~ -name "file*" -type f -size -10k

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

Теперь давайте найдем файлы в домашней директории, которые весят больше 100 мегабайт:
find ~ -type f -size +100M

Нашелся один файл, который весит более 100 мегабайт.
Также можно искать файлы определенного размера, например которые весят 1G или 1M:
find ~ -type f -size 1G
И теперь переходим к поиску файлов, которые были созданы или модифицированы n дней назад.
Например, для поиска файлов, которые были изменены или созданы менее 2 дней назад:
find ~ -type f -mtime -2

Было найдено очень много файлов. Чтобы найти только файлы определенного пользователя, нужно использовать опцию -user (edward - это мое имя пользователя, вам нужно указывать своё):
find ~ -user edward -type f -mtime -2
В домашней папке все файлы принадлежат вашему текущему пользователю, поэтому повторится список.

Но, что если Вы хотите исключить из поиска скрытые директории, не меняя при этом глубину поиска?
Данная команда может показаться сложной на первый взгляд.
find ~ \( ! -regex '.*/\..*' \) -type f -mtime-2 Вот эта вот конструкция  ( ! -regex '.*/\..*' \) как раз и уберет из поиска все скрытые файлы и директории:


Ну и для поиска файлов, которые были изменены или созданы более 100 дней назад, к примеру:
find ~ -type f -mtime +100
Это не все возможности этой команды. Я перечислил основные для поиска файлов и директорий.

Поделиться:

Если у Вас возникли вопросы.

Приглашаю задавать их на сервисе вопросов и ответов: Ask LinuxRussia.com.
Там Ваши вопросы не потеряются и Вы быстрее получите ответ, в отличие от комментариев.

6 коммент. :

  1. А как потом все что он нашел переместить в отдельную папку?

    ОтветитьУдалить
    Ответы
    1. find -maxdepth 1 -name "*html" -type f -exec mv {} remove/ \;
      find - поиск
      maxdepth - глубина поиска
      name - ищем по имени или части имени, в данном случае по расширению
      type - тип файл или папка
      -exec - перенаправление вывода, тоесть что дальше делать с найденным
      mv - в данном случае перенос, куда? в директорию remove/

      Удалить
  2. есть под Wind. прекрасная программа мгновенного поиска "Еverything" https://www.voidtools.com работает под NTFS. Многие годы пользовался, пока не перешел на Линукс. Замены не нашел, не подскажете?

    ОтветитьУдалить
  3. как убрать : *Permission denied* ? Чтобы были видны только результаты поиска

    ОтветитьУдалить
    Ответы
    1. Наверно поздно отвечаю, но добавь '2>/dev/null"

      Удалить