Курс по сетевым технологиям
A A A

В предыдущем уроке мы познакомились с командами grep и locate для поиска файлов. Однако в Линукс существует более продвинутая утилита по поиску файлов. В этом уроке мы рассмотрим ее возможности. Формат команды выглядит так: 

find каталог [опции] ключевое_слово

find является очень мощной поисковой утилитой в системе Linux. Если команда locate выполняет поиск только по специальной базе данных, то find ищет по всей файловой системе. Работает она медленнее, чем locate.

Например, у нас имеются различные фото и изображения. Попробуем найти фото, названия которых содержат слово paris: 

find /home/student/ -name paris

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

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

find /home/student/ -name “*paris*”

Вывод файлов поиска командой find

Так как мы ищем по имени, то используем опцию -name.

Однако некоторые имена файлов имеют заглавные и прописные буквы, то есть могут быть Paris, PARIS, paris. Чтобы утилита find отобразила все файлы воспользуемся опцией -iname, которая не учитывает регистр: 

find /home/student/ -iname “*paris*”

Игнорирование регистра в поиске


Если перед опцией -name или -iname поставить знак “!”, то система отобразит инвертированный результат, то есть покажет файлы, имена которых не содержат искомое слово - в данном случае paris: 

find /home/student/ ! -iname “*paris*”

Инвертированный поиск

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

-user - поиск по имени пользователя. Например, find / -user student

-group - поиск по имени группы. Например, find / -group administrator

-empty - поиск пустых файлов и каталогов. Например, find / -empty

-type - поиск по типу файла (ссылка, каталог, обычный файл).

 

В таблице представлены символы различных типов файлов:

Символ типа файла

Значение

l

Символьная ссылка

f

Обычный файл

s

Сокет

b

Специальный файл блочного типа

d

Каталог

p

Файл FIFO

c

Специальный файл символьного типа

 

Чтобы найти только каталоги с именем paris достаточно ввести find / -type d paris

 

Опция -size осуществляет поиск файла по его размеру. Необходимо указать единицу измерения размера файла, например килобайты, мегабайты и т.д.

В таблице представлены символы для указания единицы измерения:

Символ

Значение

b

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

c

Байты

k

Килобайты

M

Мегабайты

G

Гигабайты


Чтобы найти файлы размером в 1 мегабайт достаточно ввести find / -size 1M

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

А если нужно найти файлы размером больше или меньше? 

Тогда в условии добавим “+”, если размер может быть больше либо “-”, если размер меньше.

Например так: 

find / -size +1M

find / -size -1M

Кстати, символ “!” можно применить и к вышеописанным опциям.

 

На этом возможности данной команды не исчерпываются. Допустим мы решили “прочистить” файловую систему и удалить пустые файлы. Конечно существуют специальные утилиты, но представим, что их у нас нет или мы о них не знаем. Тогда нам прекрасно подойдет команда find.

Искать пустые файлы мы уже знаем как. Попробуем их сразу же удалить. Для этого существует опция -delete: find / -empty -delete 

А можно объединить сразу несколько опций? Например, если необходимо удалить только пустые каталоги, то как это сделать? 

Опции можно объединять между собой и создавать различные комбинации: 

-a (-and) - искомый файл должен соответствовать всем указанным опциям. Например, мы хотим удалить пустые каталоги, то есть у нас 2 условия: пустой и тип файла - каталог. Для этого выполним: 

find / -empty -a -type d -delete

 

-o (-or) - искомый файл должен соответствовать хотя бы одной опции. Например, мы хотим найти файлы, размер которых либо меньше 1 мегабайта либо больше 5 мегабайт: 

find / -size -1M -o +5M

 

При построении более сложных конструкций с использованием опций и может понадобиться заключить выражение в скобки \( выражение \), обязательно оставляем пробелы после “\(“  и перед “\)”. Это позволит системе правильно интерпретировать поставленные условия, а также позволит избежать ошибок со стороны пользователя. Кроме того, когда выражение заключено в скобки оно лучше читается.

Рассмотрим пример с удалением пустых каталогов: 

find  /  \( -empty -a -type d \) -delete

 

Помимо функции удаления файлов существуют и другие опции? 

Да. Вот они:

-frpint файл позволяет записывать результат поиска в файл. Например, так: 

find . -size 1M  -fprint search_result.txt

 

-exec команда {} \; - после данной опции можно указать любую команду для выполнения определенных действий над результатом поиска. Например, найдем все mp3 файлы и переместим их на флэшку: 

find / -name “*.mp3” -exec mv {}  /media/GRBS/  \;

 

А что означают фигурные скобки {}? 

Как мы уже знаем команда mv требует исходный файл/каталог и целевой файл/каталог. Фигурные скобки и выполняют роль каталога в котором якобы находится результат поиска. 

Приведем еще пример. Допустим мы хотим удалить все символьные ссылки. Для этого выполним: 

find /home/student/ -type l -exec rm {} \;

 

Как видно {} и здесь сыграли такую же роль, что и в предыдущем примере. Просто запомним, что символы {} и \; всегда используются с опцией -exec. 

-ok команда {} \; - аналог опции -exec, только перед выполнением команды всегда запрашивает разрешения у пользователя.