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

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

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

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

find /home/student/ -name paris

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

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

Так как мы ищем по имени, то используем опцию -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

Опция -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, только перед выполнением команды всегда запрашивает разрешения у пользователя.