find — поиск файлов
Поиск файлов по имени, размеру, времени, правам; действия над найденным.
Шпаргалка
9 команд
Версия для печати
-
find /etc -name nginx.conf
точное имя, поиск от /etc
-
find ~ -type f -name site.conf
только файлы, без каталогов
-
find . -name "*.log"
по шаблону (шаблон — в кавычках!)
-
find . -type f -size +100M
крупные файлы
-
find . -mtime -1
изменён за сутки
-
find . -name "*.tmp" -delete
удалить (сперва проверь без -delete!)
-
find . -type f -exec chmod 644 {} +
права 644 всем найденным файлам
-
find . -printf '%s %p\n' | sort -rn | head
топ по размеру
-
find . -path './node_modules' -prune -o -name '*.js' -print
с исключением каталога
Обзор
find обходит дерево каталогов и отбирает файлы по условиям (имя, размер, время,
тип, права), а затем может выполнить над ними действие.
find <где> <условия> <действие>
find /var/log -name "*.log"
Без действия по умолчанию -print (печатает пути). Условия комбинируются: рядом =
И; -o = ИЛИ; !/-not = НЕ; группировка \( ... \).
Рецепты
2
find . -name "*.conf"
find . -iname "*.JPG"
find . -regex '.*/.*\.(log|tmp)'
find . -type f
find . -size +100M
find . -mtime -1
find . -newer /tmp/marker
find . -user alice -group devs
find . -perm -4000
find . -empty
find /home -xdev -name '*.iso'
find . -path './node_modules' -prune -o -name '*.js' -print
find . -name "*.tmp" -delete
find . -name "*.log" -mtime +30 -delete
find . -type f -name "*.sh" -exec chmod +x {} +
find . -type d -exec chmod 755 {} +
find . -name "*.conf" -exec grep -l TODO {} +
find . -name "*.bak" -ok rm {} \;
find . -name "*.bak" -print0 | xargs -0 rm
find . -type f -printf '%s %p\n' | sort -rn | head
{} + группирует аргументы (быстрее), {} \; — по одному. -print0/xargs -0
безопасны для имён с пробелами (см. xargs).
Неполадки
5
СимптомПричина и решение
Permission denied засоряет вывод
Отбрось ошибки: find / -name foo 2>/dev/null.
Ищет слишком глубоко / на других ФС
-maxdepth N ограничит глубину (ставь ДО условий), -xdev не пересекать монтирования
(см. mount).
Случайно удалил не то с -delete
Всегда сперва прогоняй без действия (только вывод), убедись в списке, потом
-delete/-exec rm. -delete подразумевает -depth — порядок условий важен.
find с -name ничего не находит
Шаблон должен быть в кавычках ("*.log"), иначе его раскроет шелл до find. Для
регистронезависимости — -iname.
-exec медленный
{} \; запускает команду на каждый файл. Меняй на {} + (пачкой) или xargs.
См. также
- grep — Поиск строк по шаблону; регулярки, рекурсия, контекст.
- disk-usage — Куда делось место и inode — df, du, поиск крупных файлов, ловушки.
- chmod-chown — Смена прав (chmod) и владельца/группы (chown) — числовой и символьный синтаксис.
Есть неточность? Сообщить об ошибке в статье