Урок 10. Поиск файлов командой find

В этом уроке мы рассмотрим гораздо более мощную утилиту find для поиска файлов и каталогов в системах Линукс. Данная утилита содержит большое количество опций, позволяющие гибко проводить поиск по различным критериям.  Синтаксис команды выглядит так: find каталог [опции] ключевое_слово. 

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

Поиск слова paris командой find

Поиск ничего не дал. Это связано с тем, что команда ищет файл, который точно соответствует слову paris. Однако у нас в названии файла могут присутствовать и другие слова. Поэтому применим символы групповых операций и заключим наше выражение в кавычки, чтобы система правильно интерпретировала символы. Введем команду find /home/student/ -name “*paris*” :

Поиск слова paris командой find и символов групповых операций

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

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

Поиск слова без учета регистра

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

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

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

-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.

Искать пустые файлы мы уже знаем как. Попробуем их сразу же удалить. Для этого существует опция -deletefind / -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, только перед выполнением команды всегда запрашивает разрешения у пользователя.