Терминал Linux. Команды поиска файлов и директорий.

В этой статье поговорим о командах поиска файлов и директорий в терминале, таких как find, locate, whereis, which.

Комментирование приветствуется.

Цикл статей о терминале.

  1. Терминал Linux. Команды навигации в терминале.
  2. Терминал Linux. Создание, удаление, копирование, перемещение, переименование файлов и директорий.
  3. Терминал Linux. Как сохранить в файл вывод терминала.
  4. Терминал Linux. Команды поиска файлов и директорий.
  5. Терминал Linux. Команды просмотра текстовых файлов.
  6. Терминал Linux. Права доступа к каталогам и файлам в Linux, команды chmod и chown.

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

Команда find.

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

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

find путь [опции]

где путь – это директория, в которой мы хотим произвести поиск, опции - это ключи-параметры поиска.

Путь поиска команды find.

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

/usr/share

Но в качестве пути поиска можно указывать следующие значения:

. поиск в текущем каталоге;
/ поиск от корневого каталога;
~ поиск в домашнем каталоге.

Основные опции команды find.

-name поиск файлов по имени;
-user поиск файлов, принадлежащих указанному пользователю;
-type поиск файлов определенного типа. Вот наиболее используемые типы:

  • d – каталог;
  • f – обычный файл;
  • l – символическая ссылка;
-size -n,+n, n поиск файлов с размером меньше(-), больше (+) или равное n единиц;
-mtime -n, +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, чтобы найти только файлы определенного пользователя:

find ~ -user username -type f -mtime -2

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

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

find ~ \( ! -regex '.*/\..*' \) -type f -mtime-2

Данная команда может показаться сложной на первый взгляд. Вот это вот регулярное выражение ( ! -regex '.*/\..*' \) как раз и убирает из поиска все скрытые файлы и директории:

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

find ~ -type f -mtime +100

В одной статье очень трудно перечислить все возможности этой команды поиска файлов и директорий. Это самое основное и часто используемое.

Команда locate.

Помимо find для поиска файлов существует ещё команда locate.

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

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

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

sudo updatedb

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

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

locate file_name [опции]

Вводится команда locate и имя файла, который хотим найти.  И, конечно же, опции, которые разберем на примерах.

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

Давайте найдем все файлы с расширением .exe:

locate .exe

Если мы хотим вывести результаты поиска в одну строку, тогда используем следующую опцию -0 (это тире и ноль)

locate -0 .exe

Вот результат:

Но если мы ищем файл с названием "file", то не найдутся файлы с именами в другом регистре: File, FILE и т.д.
Чтобы поиск сделать регистронезависимым, то нужно использовать следующую опцию -i, то есть:

locate file -i

Если мы хотим узнать просто количество файлов, имеющих в имени "file", или количество файлов с определенным расширением, к примеру .exe, то нужно указать опцию -c:

locate .exe -c

Что означает, что в системе 10 файлов имеют расширение .exe.

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

locate .exe -n 2

То есть, данная команда с опцией -n 2 выведет нам только 2 первых найденных файла:

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

locate .exe -e

Полезные команды whereis и which.

У нас установлены программы в системе и чтобы узнать размещение бинарных файлов, исходных кодов и руководств, относящихся к установленной программе, можно выполнить команду whereis. Для примера найдем информацию о пакете google-chrome:

whereis google-chrome

Команда же which отображает полный путь к установленной программе. Также в качестве примера возьмем google-chrome:

which google-chrome

Результат выполнения данных команд:

  • https://plus.google.com/118166993767960656676 Did Mazay

    Спасибо, очень познавательно.