Поиск файлов в командной строке (кмд №1)
January 7th, 2008 | комментариев: 1
Это первая заметка из цикла «Работа в командной строке». Mac OSX — UNIX система, поэтому нельзя оставлять без внимания такой важный и мощный инструмент, как командная строка.
Для поиска файлов в unix есть две наиболее известные команды find (для поиска по именам, датам изменения итп) и grep (для поиска по содержимому файлов). Эти две стандартные команды в Mac OSX дополнены встроенным движком для поиска и индексации — Spotlight.
Другое лицо Spotlight
Spotlight решает почти все задачи для поиска. Поэтому начнем изучение с него. Команда для поиска по базе Spotlight называется mdfind.
mdfind MySQL — будет искать все упоминания в имени или содержимом файлов. Т.е. аргументом этой команды может быть все, что бы вы вписали в поле поиска Spotlight.
Но есть особенности использования команды mdfind. В отличии от основного интерфейса Spotlight, командная строка позволяет задать поле метаданных, по которому будет производиться поиск. Пример ниже.
mdfind 'kMDItemMusicalGenre == Rock' — будет искать все музыкальные файлы в стиле Rock.
А например, если есть желание посмотреть все аттрибуты (поисковые) для какого-то конкретного файла (например, чтобы найти похожее), можно воспользоваться командой mdls. Пример ниже.
mdls /Users/ilya/Music/podsafe/01-Juego-Mutandina.mp3 — т.е. единственным аргументом команды есть путь к файлу.

Если у вас есть какие-то проблемы с индексацией. Например она не работает на отдельных внешних дисках или вы хотите наоборот выключить индексацию, то команда mdutil придется вам в помощь. Пример ниже.
sudo mdutil -s / — покажет включена ли индексация для главного (рутового) диска.
Документация по этим командам: mdls mdfind mdutil
Классический unix-поиск
Преимущества этого метода:
- этот метод будет работать не только на вашем маке, но на любом другом unix (freebsd, linux, solaris итд);
- локальность — если вы собираетесь поискать в какой-то отдельной директории (например, в которой сейчас работаете в терминале или на диске, где еще нет индекса spotlight);
- возможность обработки входных/выходных данных другими unix-командами.
Например, если вы хотите удалить все html файлы из вашей директории закачек, вам может быть полезен следующий пример:
find ~/downloads -name '*.html' -exec rm {} \;
Второй пример (типичный для программистов), когда вам нужно найти строку во всех (или наоборот некоторых) файлах внутри определенной директории.
grep appleworms *.html — будет искать слово appleworms во всех файлах html в текущей директории.
Еще один пример когда мы можем слепить с помощью перенаправления ввода/вывода команд интересные вещи.
find ~/Documents -name '*.txt' | grep article — будет искать в директории Documents все файлы с расширением .txt, а после отфильтрует и покажет файлы в имени которых есть слово article.
Еще можно посмотреть множество примеров использования find здесь.
Пробуйте найти наиболее удачное сочетания обоих методов, чтобы работать в командной строке эффективно!
PS: если у кого есть готовые наборы частоиспользуемых команд поделитесь в комментариях, пожалуйста.