
Linux — это операционная система с открытым исходным кодом, которая была создана как свободная альтернатива UNIX. Как и в UNIX, командная строка является основным инструментом для работы в Linux. Здесь пользователь вводит команду в командную строку, которая затем выполняется.
Чтобы найти файл в Linux, вы можете использовать команду Linux find. Это запускает рекурсивный поиск, при котором иерархия каталогов просматривается по определенным критериям. Команда Linux find является точным инструментом для поиска файлов и каталогов и поддерживается практически во всех дистрибутивах Linux.
- Обзор команды find в Linux
- Ограничение поиска определенным каталогом
- Настройка вывода результатов поиска
- Поиск файлов в Linux: простые примеры использования
- Использование команды file в Linux для фильтрации по имени файла
- Использование команды Linux file для фильтрации по типу файлов
- Использование команды file в Linux для фильтрации по размеру
- Использование команды Linux file для фильтрации по метке времени
- Использование команды file в Linux для фильтрации по владельцу, группе и правам доступа
- Ограничение глубины рекурсии команды find в Linux
- Использование команды Linux file для поиска и обработки файлов
- Использование команды Linux file для настройки пользователя и групп
- Использование команды Linux file для настройки прав на файлы
- Использование команды Linux file для удаления пустых каталогов и файлов
Обзор команды 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 {} ;