TerminalМы продолжаем наш цикл о командной строке Mac OS X. Как мы и обещали, на этот раз речь пойдёт о возможностях поиска объектов, предоставляемых терминалом Мака. Скептики сразу удивятся и подумают: «мы уже десять лет живём в XXI веке, а вы тут предлагаете заниматься поиском через командную строку, как в старые добрые восьмидесятые?». Отчасти скептики будут правы, потому что встроенные в Mac OS X пользовательские средства поиска очень даже хороши. Но только до тех пор, пока вам не понадобится сформировать сложный запрос. В этом случае знание возможностей командной строки позволит вам сэкономить немало времени и сил.

Сегодня мы расскажем о команде find и ещё об одном средстве поиска — команде whereis.

find

Основная команда поиска имеет следующий синтаксис:

find [область поиска] [условия поиска] [шаблон свойств объекта]

Иными словами, сначала нужно указать, ГДЕ ищем, потом — КАК ищем, потом — ЧТО ищем. Про команду find и все её параметры можно писать целую книжку. Их настолько много, что пытаться осветить все из них в этом материале было бы бессмысленно. Более того, многие параметры используются крайне редко и вряд ли понадобятся рядовому (или даже продвинутому) пользователю.

Приступим к рассмотрению блоков аргументов команды find. Проще всего разобраться с областью поиска, ведь почти все принятые сокращения мы рассматривали ранее:

~ — ваша «домашняя папка»

/ — весь компьютер

. — текущий каталог

.. — каталог более высокого уровня

Кроме того, никто не запрещает ввести вам в качестве области полноценный путь к папке.

А вот параметры поиска можно рассматривать долго. Очень долго.

-name — самый популярный параметр. Ищет по имени файла.

-maxdepth — задаёт максимальную глубину поиска. Если вы введёте -maxdepth 4, то команда find не станет просматривать содержимое подподподподпапок. А вот подподподпапки она всё-таки прошерстит :)

-mindepth — задаёт минимальную глубину поиска. Если ввести -mindepth 2, то поиск будет вестить, начиная со второго уровня вложения.

-flags — задаёт атрибуты (флаги) объекта. Подробнее про список флагов мы поговорим в отдельной статье. А пока запомните, что -flags hidden ищет только скрытые файлы.

-empty — ищет только пустые файлы и папки. Никаких дополнительных параметров не требуется

-group — ищет файлы, у которых группа соответствует введённому критерию. Например, можно ввести -group wheel.

-newer — ищет все файлы новее заданного (соответственно, требуется ввести путь к файлу-эталону). «Новее» значит «более поздняя дата изменения».

-newerXY — вообще высший пилотаж поиска. Вместо X вы можете подставить B (дата создания), m (дата модификации), a (дата последнего доступа к файлу) — эти параметры относятся к объекту, который вы ищете. Вместо Y можно подставить те же параметры, но они будут относиться к объекту-эталону, путь к которому задаётся далее. Вся эта конструкция запускает поиск по сложному критерию сравнения дат: например, -neweraB file станет искать только те объекты, у которых дата последнего доступа новее, чем дата создания объекта file.

Xtime — дополнение к предыдущему параметру. Вместо X можно ввести те же сокращения. Например, -mtime 7 покажет вам только те объекты, которые модифицировались в течение последней недели.

-path — позволяет точнее указать путь к файлу. Параметр приобретает смысл, если его применять с регулярными выражениями, о которых мы поговорим позже.

-perm — задаёт права доступа к искомому объекту. Например, можно ввести -perm 644.

-size — задаёт размер файла. Вслед за size вводится число и сокращение:

  • 10с означает 10 байт;
  • 10k — 10 килобайт;
  • 10M — 10 мегабайт;
  • 10G — 10 гигабайт;
  • 10T — 10 терабайт;
  • 10P — 10 петабайт (нехилый размер, не правда ли? :)

-type — задаёт тип объекта. Тут тоже нужны сокращения (например, -file f):

  • d — папка
  • f — файл
  • l — символическая ссылка

-user — задаёт имя владельца. Подходит как имя пользователя, так и цифровое обозначение (например, -user 501).

-iname — поиск по имени без учёта регистра

-ipath — поиск по пути без учёта регистра

Думаете, это всё? Если бы :)

find -a — ищет тот объект, параметры которого удовлетворяют сразу двум критериям поиска. Таким образом можно требовать что-то вроде: find -name ... -a -user ..., тогда команда будет искать файлы по имени и по владельцу, к примеру. Запоминается легко — a — and. Прямо как в естественном языке — пишем условия слева и справа от данного флага.

find -o — аналогична предыдущей команде, однако ищет то, что удовлетворяет хотя бы одному из критериев (o тут служит в роли or — или). В случае описанного выше примера мы можем искать файлы либо принадлежащие кому-то, либо, к примеру, ещё кому-то, тут не получится задать «и», так как файл не может принадлежать сразу нескольким, только одному пользователю.

find -n — днная команда продолжает наш рассказ о логических запросах, мы можем указать, какой параметр не должен встречаться у файла, тут n — not. Мы можем инвертировать значение логического выражения также с помощью !, указав его перед скобками. find . ! \( -name «*.jpg» \) найдёт нам всё, что не имеет суффикса .jpg, то есть, предположительно не фотографии, таким образом, указав нужные расширения, мы можем отделить музыку от плейлистов с обложками, к примеру. Опции эти могут пригодиться при построении сложных запросов с участием сразу нескольких таких вот флагов, ведь мы можем без проблем комбинировать and и or, а также «!» для отрицания.

find -exec — эта команда поможет нам выполнить с найденными файлами некоторое действие, которое просто задаётся командой после данной опции. find . -name «*» -exec cat покажет нам все найденные файлы. Тут для простоты я предполагаю, что всё в данной директории — обычные тектовые файлы и я могу их так просто вывести, это нужно для упрощения примера, однако можно строить куда более сложные запросы, используя полученные знания, относящиеся к логическим запросам.

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

Полагаем, нет смысла говорить о том, что комбинировать все эти параметры можно как угодно. Можно даже вбить всё это в одну команду!

Попробуйте поиграться с find и ввести что-нибудь типа:

find ~ -type f -iname iTunes -size 20M -mtime 14 -user 501 -perm 755

whereis

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

whereis find

И вам покажут местонахождение бинарного файла команды (/usr/bin/find). Пользоваться этой командой вам придётся нечасто, но иногда она может пригодиться.

Рассмотренная команда find становится по-настоящему полезной, если вы знаете основы построения регулярных выражений. Об этом мы поговорим в следующей статье.

Поделитесь страницей через социальные сети