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