Find и grep

find — синтаксис и зачем оно нужно

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

Базовый синтаксис ключей (забран с Вики):

  • -name — искать по имени файла, при использовании подстановочных образцов параметр заключается в кавычки. Опция -name' различает прописные и строчные буквы; чтобы использовать поиск без этих различий, воспользуйтесь опцией -iname‘;
  • -type — тип искомого: f=файл, d=каталог, l=ссылка (link), p=канал (pipe), s=сокет;
  • -user — владелец: имя пользователя или UID;
  • -group — владелец: группа пользователя или GID;
  • -perm — указываются права доступа;
  • -size — размер: указывается в 512-байтных блоках или байтах (признак байтов — символ «c» за числом);
  • -atime — время последнего обращения к файлу (в днях);
  • -amin — время последнего обращения к файлу (в минутах);
  • -ctime — время последнего изменения владельца или прав доступа к файлу (в днях);
  • -cmin — время последнего изменения владельца или прав доступа к файлу (в минутах);
  • -mtime — время последнего изменения файла (в днях);
  • -mmin — время последнего изменения файла (в минутах);
  • -newer другой_файл — искать файлы созданные позже, чем другой_файл;
  • -delete — удалять найденные файлы;
  • -ls — генерирует вывод как команда ls -dgils;
  • -print — показывает на экране найденные файлы;
  • -print0 — выводит путь к текущему файлу на стандартный вывод, за которым следует символ ASCII NULL (код символа 0);
  • -exec command {} \; — выполняет над найденным файлом указанную команду; обратите внимание на синтаксис;
  • -ok — перед выполнением команды указанной в -exec, выдаёт запрос;
  • -depth или -d — начинать поиск с самых глубоких уровней вложенности, а не с корня каталога;
  • -maxdepth — максимальный уровень вложенности для поиска. «-maxdepth 0» ограничивает поиск текущим каталогом;
  • -prune — используется, когда вы хотите исключить из поиска определённые каталоги;
  • -mount или -xdev — не переходить на другие файловые системы;
  • -regex — искать по имени файла используя регулярные выражения;
  • -regextype тип — указание типа используемых регулярных выражений;
  • -P — не разворачивать символические ссылки (поведение по умолчанию);
  • -L — разворачивать символические ссылки;
  • -empty — только пустые каталоги.

Примерно тоже самое, только больше и в не самом удобочитаемом виде, т.к надо делать запрос по каждому ключу отдельно, можно получить по

find -help

find примеры использования

Ищем все файлы, начиная с текущей директории, название которых начинается на crux:

find . -name 'crux*'

Найти все файлы, начиная с корневой директории, название которых начинается на scrux:

find / -name 'crux*'

Поиск в директориях /usr/local/man и /opt/local/man файлов, название которых начинается на crux:

find /usr/local/man /opt/local/man -name 'crux*'

Ищем все файлы, начиная с текущей директории, название которых начинается на crux или qu. Обратите внимание, что по умолчанию все аргументы соединены с помощью логического и (опция ‘-a‘). Если необходимо объединить несколько аргументов логическим или — используйте ключ ‘-o‘:

find . \( -name "crux*" -o -name "qu*" \) -print

Ищем графические файлы, начиная с текущего каталога (см.на кавычки):

find . -type f -regex ".*\.\(jpg\|jpeg\|gif\|png\|JPG\|JPEG\|GIF\|PNG\)"

Вывести список файлов (см. на / ) во всей файловой системе, чей размер больше 100 Мб:

find / -size +100M -print

Ищем файлы в указанных каталогах:

find /var/spool/postfix/{deferred,active,maildrop,incoming}/ -type f

Еще примеров можно поискать туттак или здесь. Да тысячи их, но проще попрактиковаться самому, используя —help для нужного запроса и поиск в необходимой директории.

grep примеры использования

В принципе для работы grep не обязательно указывать даже файл или директорию, но это крайне желательно, если Вы хотите найти всё быстрее и точнее. Например:

grep cruxf

Найдет файлы с упоминанием меня любимого, если таковые есть. Точнее не файлы, а строки с упоминанием указанного слова, т.е в данном случае crux. Здесь стоит упомянуть, что строкой grep считает все символы, находящиеся между двумя символами новой строки.

grep crux file.txt поиск crux в файле file.txt, с выводом полностью совпавшей строкой
grep -o crux file.txt поиск crux в файле file.txt и вывод только совпавшего куска строки
grep -i crux file.txt игнорирование регистра при поиске
grep -bn crux file.txt показать строку (-n) и столбец (-b), где был найден crux
grep -v crux file.txt инверсия поиска (найдет все строки, которые не совпадают с шаблоном crux)
grep -A 3 crux file.txt вывод дополнительных трех строк, после совпавшей
grep -B 3 crux file.txt вывод дополнительных трех строк, перед совпавшей
grep -C 3 crux file.txt вывод три дополнительные строки перед и после совпавшей
grep -r crux $HOME рекурсивный поиск по директории $HOME и всем вложенным
grep -c crux file.txt подсчет совпадений
grep -L crux *.txt вывести список txt-файлов, которые не содержат crux
grep -l crux *.txt вывести список txt-файлов, которые содержат crux
grep -w crux file.txt совпадение только с полным словом crux
grep -f cruxs.txt file.txt поиск по нескольким crux из файла cruxs.txt, шаблоны разделяются новой строкой
grep -I crux file.txt игнорирование бинарных файлов
grep -v -f file2 file1 > file3 вывод строк, которые есть в file1 и нет в file2
grep -in -e ‘python’ find -type f рекурсивный поиск файлов, содержащих слово python с выводом номера строки и совпадений
grep -inc -e ‘test’ find -type f | grep -v :0 рекурсивный поиск файлов, содержащих слово python с выводом количества совпадений
grep . *.py вывод содержимого всех py-файлов, предваряя каждую строку именем файла
grep «Http404» apps/**/*.py рекурсивный поиск упоминаний Http404 в директории apps в py-файлах

И так далее и тому подобное. Потрясающе доступный с точки зрения простоты чтения и понимания, мануал по grep’у есть например тут. Ну либо у буржуев, как и всегда (если Вы знаете английский).