find . -name "*.log" # по маске от текущего каталогаfind . -iname "APP.LOG" # без учёта регистраfind / -name "config.yaml" 2>/dev/null # по всей системе
Маску всегда бери в кавычки: без них шелл раскроет звёздочку по текущему каталогу до запуска find. Хвост 2>/dev/null прячет Permission denied при поиске от корня.
find: по типу и свойствам
find . -type d # только каталогиfind . -type f -name "*.py" # только файлыfind . -type f -mtime -1 # изменённые за суткиfind . -type f -size +100M # больше 100 МБ
Условия комбинируются простым перечислением — это логическое И. -mtime считает сутками: -1 значит «моложе 24 часов», +7 — «старше недели».
{} — место подстановки найденного, + собирает все находки в один вызов команды. Перед разрушающим -exec запусти тот же find без него и проверь список.
grep: поиск текста в файле
grep "ERROR" app.log # строки с ERRORgrep -n "ERROR" app.log # + номера строкgrep -in "error" app.log # без учёта регистра
grep по умолчанию чувствителен к регистру: без -i строки с error в нижнем регистре молча выпадут из выдачи, и пропажу легко не заметить.
grep -r: поиск по проекту
grep -rn "TODO" . # рекурсивно, файл:строкаgrep -rl "TODO" src/ # только имена файловgrep -rn --exclude-dir=node_modules --exclude-dir=.git "TODO" .
Каталог grep сам не обходит — без -r ответит Is a directory. В репозиториях сразу исключай .git и node_modules, иначе выдачу зальёт служебными совпадениями.
grep -v и -c: фильтр и счёт
grep -v "INFO" app.log # строки БЕЗ образцаgrep -c "INFO" app.log # только число совпавших строкps aux | grep -v grep | grep nginx # классика фильтров
-v инвертирует условие, -c печатает счётчик вместо строк. В связке ps | grep сам grep попадает в выдачу — его выкидывают через -v grep (или берут pgrep).