Команда Linux find: поиск и нахождение файлов

Linux — это операционная система с открытым исходным кодом, которая была создана как свободная альтернатива UNIX. Как и в UNIX, командная строка является основным инструментом для работы в Linux. Здесь пользователь вводит команду в командную строку, которая затем выполняется.

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

Обзор команды find в Linux

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

find <directory_path> <search_parameter>
Примечание

Внимание: Будьте осторожны с командами в командной строке. Если вы по неосторожности выполните неправильную команду, вы можете повредить свою систему!

Сначала пишется сама команда, затем путь к каталогу и переменное количество параметров поиска. Параметр поиска состоит из дефиса, за которым сразу следует имя параметра. Затем следует пробел и значение параметра. Ниже приведен обзор наиболее часто используемых параметров поиска:

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

Объяснение

-name, -iname

Фильтр по имени файла

-тип

Фильтр по типу файла

-размер, -пустой

Фильтр по размеру файла

-ctime, -mtime, -atime

Фильтр по метке времени

-user, -group

Фильтр по владельцу и группе

-perm

Фильтр по правам на файл

 

Несколько параметров поиска можно также комбинировать. Здесь неявно предполагается логическая операция AND. Это можно записать в явном виде. Кроме того, может быть использована связь ИЛИ или условие может быть отрицанием:

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

Объяснение

Результаты поиска должны удовлетворять обоим условиям

-or

Результаты поиска должны удовлетворять хотя бы одному из двух условий

-not

Отрицание последующего условия

 

Обратите внимание, что в следующих примерах кода для запуска примеров необходимо заменить <заполнители> на фактические значения.

Ограничение поиска определенным каталогом

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

find . <search_parameter>

Для поиска в собственной папке пользователя в качестве пути к каталогу используйте тильду «~»:

find ~ <search_parameter>

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

find / <search_parameter>
Примечание

Внимание: Будьте крайне осторожны при применении команды Linux find в сочетании с параметром «-exec» ко всей системе!

Настройка вывода результатов поиска

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

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

find <directory_path> <search_parameter> | less

Чтобы подсчитать количество результатов, мы передаем вывод команды find команде wc с параметром «-l»:

find <directory_path> <search_parameter> | wc -l

Чтобы просмотреть только первые или последние n результатов поиска, мы передаем вывод команды find командам «head» и «tail». В каждом случае мы указываем параметр «-n», за которым следует желаемое количество результатов поиска:

find <directory_path> <search_parameter> | head -n <amount>
find < directory_path> <search_parameter> | tail -n <amount>

Поиск файлов в Linux: простые примеры использования

В следующих примерах поиск ограничивается текущим каталогом и любыми подкаталогами. Для перехода в любой каталог используйте команду cd в командной строке. Чтобы проверить эти примеры, сначала перейдите в папку пользователя:

cd ~

Использование команды file в Linux для фильтрации по имени файла

Для фильтрации по именам файлов используйте параметр «-name». Он требует точного имени файла и чувствителен к регистру:

find . -name <File_Name>

Здесь мы ищем файл с точным именем «.gitignore».

find . -name .gitignore

Чтобы не различать строчные и прописные буквы, мы используем параметр «-iname». Буква «I» здесь означает «insensitive», от «case-insensitive»:

find . -iname <file_name>

Обычно практичнее сначала искать без учета регистра и использовать параметр «-name» только в том случае, если поиск с «-iname» дает слишком много результатов.

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

find . -iname "*git*"

Использование команды Linux file для фильтрации по типу файлов

Известным аспектом философии UNIX является принцип «все является файлом» — и то же самое применимо в Linux. Термин «файл» относится к файлам в более широком смысле. Другими словами, каталоги также отображаются как файлы в Linux. Но чтобы избежать путаницы, иногда используется более точный термин «дескриптор файла».

Когда мы говорим о «типе файла» в Linux, мы не имеем в виду, является ли документ файлом Excel или изображением JPEG. Вместо этого мы различаем различные типы дескрипторов файлов, которые существуют в Linux. Команда find в Linux предоставляет нам параметр поиска «-type» для фильтрации по типу файла. Например, мы можем различать файлы и каталоги при поиске. Ниже мы приводим обзор наиболее часто используемых типов файлов:

Тип файла

Объяснение

f

Файл

d

Каталог

l

Ссылка

 

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

find . -type f

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

find . -type d

Для фильтрации по расширению файла мы используем параметр «-iname» и звездочку в качестве подстановочного знака.

Найти все файлы с расширением jpeg или JPEG:

find . -type f -iname "*.jpeg"

Найти все файлы с расширением jpeg/JPEG или jpg/JPG:

find . -type f -iname "*.jpeg" -or -iname "*.jpg"

Использование команды file в Linux для фильтрации по размеру

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

  • Имя
  • тип файла
  • Размер файла
  • Временная метка
  • Владелец и группа
  • Права доступа

Все это можно отфильтровать с помощью команды find и соответствующих параметров. Для фильтрации по размеру файла используется параметр «-size», за которым следует спецификация размера.

Следующая команда find возвращает файлы размером не менее 700 мегабайт:

find . -size +700M
Примечание

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

Характеристики размера состоят из числа, за которым следует единица измерения. Ниже приведен обзор доступных единиц измерения:

Единица

Объяснение

c

Байт

k

Килобайты

M

Мегабайты

G

Гигабайты

b

512-байтовые блоки

 

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

Модификатор

Объяснение

+

Файл больше указанного размера

Файл меньше указанного размера

Следующая команда предоставляет вам файлы, размер которых меньше 500 мегабайт:

find . -size -500M

Следующая команда предоставляет вам файлы, размер которых находится в диапазоне от 400 до 500 мегабайт.

find . -size +400M -and -size -500M

В дополнение к указанию точного размера или диапазона размеров, «-empty» является отдельным параметром для поиска пустых файлов:

find . -type f -empty

Эта команда также работает для каталогов:

find . -type d -empty

Использование команды Linux file для фильтрации по метке времени

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

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

Объяснение

-ctime, -cmin

Фильтр по дате создания

-mtime, -mmin

Фильтр по дате модификации

-atime, -amin

Фильтр по дате доступа

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

find . -type f -mtime 1

Отображаемые параметры поиска с «time» в имени интерпретируют следующее значение как количество дней. Параметры с «min» в названии интерпретируют следующее значение как количество минут.

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

Модификатор

Объяснение

+

Временная метка больше дней назад, чем указано

Временная метка создана меньше дней назад, чем указано

Чтобы найти файлы, которые были созданы более 100 дней назад, мы используем параметр поиска «-ctime», за которым следует значение «+100»:

find . -type f -ctime +100

Как и при фильтрации по размеру файла, параметры поиска можно комбинировать, чтобы охватить диапазон. Чтобы найти файлы, доступ к которым был получен от трех до пяти дней назад, мы используем параметр поиска «-atime» дважды, каждый раз со значениями «+2» и «-6». Явная комбинация через параметр «-and» необязательна:

find . -type f -atime +2 -and -atime -6

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

find . -type f -mmin -5

Использование команды file в Linux для фильтрации по владельцу, группе и правам доступа

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

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

Объяснение

-user

Фильтр по владельцу

-группа

Фильтр по группе

-perm

Фильтр по правам доступа

Для поиска файлов, принадлежащих пользователю root, мы используем параметр поиска «-user», за которым следует значение «root»:

find . -user root

Для поиска файлов, принадлежащих собственному пользователю, мы используем параметр поиска «-user», за которым следует выражение «$(whoami)». Последнее преобразуется в имя вошедшего в систему пользователя:

find . -user $(whoami)

Для поиска дальнейших файлов, принадлежащих группе admin, мы используем параметр поиска «-group», за которым следует значение «admin»:

find . -group admin

Кроме фильтрации по владельцу и группе, можно также фильтровать по правам доступа. Для этого используется триплет восьмеричных чисел. Часто используемые значения включают «644», «755» и т.д. Первое число определяет права доступа для владельца, второе — для группы, третье — для других пользователей. Каждое из трех восьмеричных чисел создается путем сложения отдельных прав. Более подробно о том, как это работает, мы рассказываем в нашей статье о назначении прав доступа к каталогам с помощью chmod.

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

find . -perm 777

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

find . -perm 700

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

find . -perm -007

Ограничение глубины рекурсии команды find в Linux

Обычно команда Linux find рекурсивно проходит по всем подкаталогам. Однако часто бывает полезно ограничить глубину рекурсии. Для этого используются параметры поиска «-maxdepth» и «-mindepth»:

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

Объяснение

-maxdepth

Максимальная глубина рекурсии

-mindepth

Минимальная глубина рекурсии

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

find . -type f -maxdepth 2 -size +50M

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

find . -type f -mindepth 3 -and -maxdepth 5 -size +50M

Использование команды Linux file для поиска и обработки файлов

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

Далее рассмотрим общую схему выполнения команды для каждого найденного файла. Для этого мы используем параметр «-exec», за которым следует команда Linux и ее параметры. Вся команда завершается всегда неизменным текстом «{} ;»:

find <directory_path> <find_parameter> -exec <command_and_parameter> {} ;

Обратите внимание, что выполнение команды происходит без подсказки! В зависимости от выбранных параметров поиска и заданной команды, выполнение команды find с параметром «-exec» может привести к серьезным повреждениям системы.

Чтобы ограничить риск, существует параметр «-ok», который аналогичен параметру «-exec». Он заставляет интерактивно подтвердить обработку каждого отдельного найденного файла:

find <directory_path> <search_parameter> -ok <command_and_parameter> {} ;

В качестве меры предосторожности в следующих примерах мы ограничиваем глубину рекурсии только одним подкаталогом с помощью параметра «-maxdepth 1».

Примечание

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

Использование команды Linux file для настройки пользователя и групп

Чтобы установить владельца и группу всех файлов и каталогов в значение «www-data», мы используем следующую команду find с командой chown:

find . -maxdepth 1 -exec chown www-data:www-data {} ;

Использование команды Linux file для настройки прав на файлы

Чтобы найти файлы с правами «777» и установить их на «664», мы используем следующую команду find с командой chmod:

find . -type f -maxdepth 1 -perm 777 -exec chmod 664 {} ;

Чтобы установить права доступа ко всем каталогам на «755», мы используем следующую команду find с командой chmod:

find . -type d -maxdepth 1 -exec chmod 755 {} ;

Использование команды Linux file для удаления пустых каталогов и файлов

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

Для удаления всех пустых каталогов Linux мы используем следующую команду find вместе с командой rmdir:

find . -type d -maxdepth 1 -empty -ok rmdir {} ;

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

find . -type f -maxdepth 1 -empty -ok rm {} ;

Оцените статью
cdelat.ru
Добавить комментарий