Pull to refresh

Comments 17

На самом деле, вроде такая мимоходная заметка, но команда find чуть ли не самая используемая мной команда в моей работе. Спасибо за статью!

Намного больше люблю такие статьи, чем 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?

Греп же в примерах ищет не в имени, а в содержимом

Точно! Не обратил внимания на xargs.

Для поиска файлов на дисках пользую:
sudo apt install -y mlocate
sudo updatedb
sudo locate file.name

Оч. быстро ищет )

Потому что ищет в своей базе. Выполните updatedb , а потом `touch newfile.txt` и новый файл не сможет найти. Переиндексация запускается раз в сутки по cron.

Спасибо, кэп. Ес-но, нужна переиндексация. Чудес не бывает.

поиск файлов определённого типа, то есть по заданному расширению

все же тип файла и расширение это не одно и то же. Да и нет никаких расширений в юниксе. Но это камень в огород Аби (автора), а за перевод статьи респект.

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 {} \; \;

но так не работает......

Sign up to leave a comment.