Библиотека сайта rus-linux.net
10 советов по использованию утилиты GNU Find
Оригинал: "10 Tips for Using GNU Find "Автор: Joe 'Zonker' Brockmeier
Дата публикации: 07 June 2010
Перевод: Н.Ромоданов
Дата перевода: июнь 2010 г.
Утилита GNU find одна из самых полезных команд, с которыми вам удастся когда-либо познакомиться. На первый взгляд, параметры и синтаксис команды может показаться некоторым шаманством. Но, при наличии небольшого опыта, вы сможете практически без всяких проблем найти в вашей системе любой файл. Для того, чтобы помочь вам на начальном этапе, мы предлагаем десять способов использования утилиты find, которые помогут вам получить то, что вы ищете.
Обратите внимание, что не все версии утилиты find одинаковы. Команда find, которую вы будете использовать на Linux, слегка отличается от команды find для BSDs, Solaris и Mac OS X. Большая часть синтаксиса команды одинакова и может использоваться в любой системе, но отличия есть
Основные приемы использования
Давайте начнем с самого простого. Если вы хотите найти файл и вы знаете имя этого файла, но не знаете, где вы ее сохранили, синтаксис команды очень прост. Просто наберите команду find и укажите конкретное имя:
find -name filename
Если файл с именем filename существует, то команда find покажет местоположение файла или файлов, которые соответствуют этому имени, следующим образом:
jzb@kodos:~$ find -name filename ./projects/filename jzb@kodos:~$
Поиск файлов по их размеру
Иногда для поиска файлов бывает полезно использовать и другие атрибуты. Так, например, поиск файлов по размеру. Хороший пример: вы работаете с сервером и заметили, что один из разделов начинает быстро заполняться. С каким файлом или файлами это связано? Вы можете использовать команду find для поиска файлов по размеру, а затем решить, как освободить место.
Не удивительно, что вариант с проверкой по размеру имеет параметр -size, за которым указывается размер, который вы ищете. Вы можете указывать размеры от блоков (b) до гигабайтов (G). Чтобы найти файлы, размер которых 100k, надо выполнить:
find -size 100k
В результате будут найдены файлы, размер которых равен 100K. Однако, так команду используют редко. Чтобы найти файлы, которые больше или меньше задаваемого размера, в дополнение к размеру указывайте + или -. Так, например, команда find -size +100k должна вернуть файлы, размер которых больше 100k, а команда find -size -100k должна вернуть все, что меньше.
Вы также можете найти все пустые файлы, если будете использовать параметр -empty:
find -empty -type -f
Обратите внимание на то, что я дополнительно добавил проверку, что файл является именно файлом. Без этого команда find укажет в качестве пустых файлов и директории.
Поиск файлов по их владельцу
Другим удобным вариантом использования команды find является поиск файлов по их владельцу, либо поиск файлов, у которых нет владельца. Давайте начнем с последнего. Если вы переписали файлы из другой системы, либо если были удалены некоторые пользователи, то, возможно, есть файлы, у которых нет владельцев. Чтобы найти такие файлы, используйте следующую команду:
find -nouser
Чтобы найти файлы, у которых есть реальный владелец, используйте параметры -user или -uid. Параметр -uid позволяет вам искать файлы по числовому идентификатору пользователя (UID), а параметр -user позволяет искать по имени пользователя или UID. Так что если я хочу найти в директории все свои файлы, я должен использовать команду find -user jzb, либо я могу воспользоваться командами find -user 1000 или find -uid 1000.
Возможно, вы захотите найти файлы, принадлежащие пользователю A или пользователю B. Вы можете сделать это, добавив оператор -o:
find -user root -o -user www-data
Будут найдены все файлы, принадлежащие пользователю root или пользователю www-data. Если вы хотите найти все файлы, которые не принадлежат конкретному пользователю, вы можете использовать оператор -not:
find -not -user www-data
Конечно, операторы также работают и с другими вариантами команды поиска. Вы можете задать поиск всех файлов, принадлежащих пользователю, и которые не больше определенного размера, например:
find -user www-data -not -size +100k
Поиск файлов по группе пользователей
Еще одним способ поиска файлов — это поиск по группам, используя параметр -group. В параметре -group указывается название группы или идентификатор группы ID (GID). Основной синтаксис сравнительно прост: find -group groupname. Естественно, вы можете совместить эту команду с другими операторами. Команда может оказаться полезной, если вы пытаетесь найти все файлы, принадлежащие определенному пользователю, которые также принадлежат и определенной группе.
Поиск файлов по правам доступа к файлам
Возможно, вы захотите проверить, есть ли в файловой системе файлы, запись в которые разрешена всем, либо с другими "неправильными" правами доступа. Утилита find поддерживает эту возможность в нескольких различных вариантах. Простейшим вариантом является использование операторов -readable, -writable и -executable. С их помощью можно увидеть, имеет ли файл доступ на чтение для пользователя, который запускает команду find. Заметим, что эти параметры недоступны в более ранних версиях утилиты find. так что если ваш дистрибутив не из самых последних, вы при поиске не сможете воспользоваться этими параметрами.
Еще одним вариантом является поиск файла с использованием параметра -perm, который фактически проверяет режим использования файла. Таким образом, вы сможете увидеть, соответствует ли файл определенному набору прав доступа. Например, если вы хотите увидеть, какие файлы являются исполняемыми для владельца файла и группы, используйте следующую команду:
find -type f -perm -110
Значение 110 указывает утилите find "искать файлы с установленным битом executable (исполняемый) для владельца и группы" и игнорировать другие биты. То есть, если файл доступен для записи и чтения, то это нормально в случае, если также установлен бит, разрешающий исполнение файла.
Чтобы ограничить поиск только файлами, которые точно соответствуют указанному режиму, не используйте оператор –.
А что, если вы хотите найти файлы, у которых бит executable установлен для владельца или группы? Вместо — используйте оператор /:
find -type f -perm /110
Будут найдены файлы, у которых бит executable установлен для владельца или группы.
Поиск по правам доступа к файлам может быть очень полезным, но он несколько сложен. Для тех пользователей, которые не очень разбираются с понятиями прав доступа к файлам, потребуется некоторое время на то, чтобы разобраться с синтаксисом команд. Это та ситуация, в которой не только желательно, но и необходимо чтение страниц описаний man.
Использование регулярных выражений
Иногда вам при сравнении файлов может потребоваться использовать регулярные выражения. Разумеется, утилита find поддерживает их использование, даже больше, чем вы ожидали. Утилита find не только поддерживает регулярные выражения, она обрабатывает регулярные выражения с различным синтаксисом. С помощью параметра -regextype вы можете задать один из поддерживаемых типов синтаксиса, таких как posix-awk, posix-egrep и т.п. Смотрите поддерживаемые типы в странице man.
Сразу приведем пример. Скажем, я хочу найти все файлы, расширения которых .php или .js. Я бы мог выполнить это следующим образом:
find -regextype posix-egrep -regex '.*(php|js)$'
Это выглядит немного сложно, не так ли? В качестве опровержения укажем, что здесь используется синтаксис egrep (-regextype posix-egrep), а затем задается регулярное выражение, используемое для поиска. Выражение начинается и заканчивается одиночными кавычками для того, чтобы чтобы сама shell-оболочка не пыталась обработать регулярное выражение. Затем идет выражение .*, где используется универсальный символ, соответствующий любому символу или набору символов. Часть (php|js) говорит о том, что надо искать php или js. Конвейер (|) в этом выражении соответствует логическому выражению "или". Наконец, знак доллара ($), которым заканчивается выражение, говорит о том, что эти расширения мы ищем в конце имени файла. Так что если у вас есть файл с именем js.txt, он не будет соответствовать критерию поиска.
Как и в случае с поиском по правам доступа , регулярные выражения могут быть сложными. Мы могли бы затронуть эту тему в будущих статьях. Но сейчас смотрите страницу man утилиты find и документацию к ней.
Работаем с временем
А что, если вы хотите найти файлы по времени их создания? Это иногда бывает удобным в случае, если вы пытаетесь найти файл, о котором вы знаете, в каком промежутке времени он был создан, либо если вы хотите найти старые файлы для того, чтобы их удалить. В действительности причин использовать поиск по времени создания файла может быть достаточно много.
В утилите find есть все для поиска по времени работы с файлом. Вы можете искать по времени доступа (-atime), либо по времени последней модификации файла (-mtime), либо по времени последнего его изменения (-ctime).
Например, давайте найдем все файлы, которые не модифицировались последние два дня:
find -mtime +2
В качестве параметра указывается число, которое интерпретируется как "п раз по 24 часа тому назад" и фактически задает диапазон. Если вы укажите +1, утилита find будет его интерпретировать как "по крайней мере 24 часов назад, но не более 48 часов назад".
Если вы хотите искать файлы в определенном диапазоне, вы можете комбинировать варианты. Так команда find -mtime +2 -mtime -5 будет означать "два или более дней назад, но не более чем на пять дней назад".
Работаем с минутами
Иногда вам требуется искать файлы, модифицированные в течение прошедшего дня, а предыдущие варианты поиска не слишком точны для этого. Утилита find хороша тем, что в ней также есть параметры -amin, -cmin и -mmin, которые похожи на ранее рассмотренные параметры, но в них используются минуты, а не дни. Так что если вы хотите посмотреть на то, какие файлы были изменены или к каким из них был доступ в последний день, вы можете использовать эти параметры.
Ограничения на поиск
Иногда утилита find предоставляет больше результатов, чем вам нужно. Вы можете ограничить результаты поиска, выдаваемые утилитой find, указав для этого параметр maxdepth. Например, если вы хотите найти все JavaScript файлы в директории WordPress, вы можете использовать следующую команду:
find wordpress -name '*js'
Но что, если вы хотите видеть только те JavaScript файлы, которые находятся в директории на самом верхнем уровне? Вы можете ограничить поиск с помощью параметра -maxdepth:
find wordpress -maxdepth 1 -name '*js'
Поиск будет осуществляться только в директории WordPress, но не в поддиректориях. Если изменить значение -maxdepth на 2, то поиск будет осуществляться в поддиректориях директория WordPress, но не в более глубоких поддиректориях.
Комбинируем утилиту find с другими командами
Теперь, когда вы нашли файлы, которые искали, что вы собираетесь с ними делать? Вы можете использовать в утилите find параметры xargs или -exec, которые позволяют указывать действие, выполняемое над файлами после того, как вы их найдете.
Допустим, вы хотите изменить владельца файла с root на www-data сразу для большого количества файлов. Поиск всех этих файлов является только первым шагом, вам нужно также изменить владельца файла. Делать это вручную по списку, который возвратила утилита find, весьма утомительно. Поэтому для смены владельцев файлов вы можете захотеть воспользоваться параметром -exec:
find -user root -exec chown www-data {} \;
В этой команде указано передать все файлы, которые были найдены, утилите chown и изменить владельца файлов на www-data. Это — на сладкое.
Заключение
Знание возможностей утилиты find является обязательным для всех пользователей Linux, которые хотят освоить свою систему. Когда используется рабочий стол, вы можете обойтись без утилиты find, но при администрировании системы вам нужно иметь свои приемы применения утилиты find. Если вы собираетесь использовать параметры -exec и xargs для внесения изменений в файлы или удаления файлов, сначала сделайте один или пару тестов с тем, чтобы убедиться, что команда работает так, как ожидается.