Comments 17
Намного больше люблю такие статьи, чем man'ы, кладу в закладки. Спасибо!
При поиске файлов по расширениям не учли, что эти файлы могли быть созданы в операционных системах в которых регистр не имеет значения. Например в windows. Потому -name "*.txt" лучше заменить на -iname "*.txt". Тогда будет искать и "*.txt" и "*.TXT" и "*.tXt"
find . -type f -name "*.cpp" -o -name "*.txt"
Здесь ошибка. Эта команда ищет файлы *.cpp и любые объекты *.txt (ваше счастье, что у вас нет таких каталогов). Условия с OR надо заключать в скобки. А поскольку у bash свой взгляд на скобки, их надо ещё и экранировать:
find . -type f \( -name "*.cpp" -o -name "*.txt" \)
Я бы добавил, что выражения в find - обычные булевы операции. При этом -o - это -or, a -and - это -a или его можно вообще опустить.
Т.е. можно написать что-то вроде:
find . -type d -name config -or -type f -name "*.cfg"
И пример с грепом можно переписать в виде:
find . -name "*alice*" -name "*.txt"
-not тоже присутствует. Про скобочки написали выше.
Моя любимая команда - такую гибкость использования ещё поискать надо.
ЗЫ Ну и куда без ... -empty -delete?
sudo apt install -y mlocate
sudo updatedb
sudo locate file.name
Оч. быстро ищет )
поиск файлов определённого типа, то есть по заданному расширению
все же тип файла и расширение это не одно и то же. Да и нет никаких расширений в юниксе. Но это камень в огород Аби (автора), а за перевод статьи респект.
Тема printf не раскрыта.
find / -not \( -path /root -prune \) -not \( -path /proc -prune \) -not \( -path /sys -prune \) -not \( -path /tmp -prune \) -not \( -path /boot -prune \) -not \( -path /run -prune \) -not \( -path /home -prune \) -not \( -path /media -prune \) -not \( -path /mnt -prune \) -and \( -newer /root/time1 \) -and \( ! -newer /root/time2 \)
Поиск созданных файлов в системе, между 2-мя событиями, метки которых touch /root/time1 и /root/time2
Нашёл ошибку
Ctime – время создания файла
На самом деле, узнать время создания файла в Linux -задача не тривиальная, и далеко не все ФС записывают этот параметр.
ctime - change time - время последнего изменения атрибутов файла (данных которые хранятся в inode-области) : путь файла, права доступа. В случае изменения содержимого файла - тоже меняется.
find понимает printf. Например, поиск файлов по расширению с сортировкой по размеру:
find . -type f -iname "*.mp4" -printf '%s\t%f\n' | sort -rn
Отличная статья. иногда тоже пользуюсь ей как шпаргалкой.
Но вот кто подскажет как иcпользовать find внутри другого find?
Например: нужно найти каталоги с именем _temp и в них найти фаилы старше 2 суток?
find /opt/stores/ -type d -name '_temp' -exec echo {} \;
ищет каталоги
find . -name '*' -type f -mtime +2 -exec ls -la {} \;
ищет фаилы
если объединить?
find /opt/stores/ -type d -name '_temp' -exec find {} -name '*' -type f -mtime +2 -exec ls -la {} \; \;
но так не работает......
15 супер полезных примеров команды find в Linux