Вопрос или проблема
find . -type f -size +390625 -prune '/oracle' -exec ls -lh {} \;
find: bad option /oracle
Просто хочу найти все большие файлы в системе, исключив /oracle.
Спасибо заранее.
Опция -prune
не принимает аргументов.
Вместо этого, когда она вызывается для рассматриваемого пути, это заставляет find
не заходить в него.
Поскольку каталог, в котором вы просите find
найти файлы, это .
, путь к любому файлу не может быть /oracle
. В лучшем случае это может быть ./oracle
, если вы выполняете эту команду, когда текущий рабочий каталог — это /
.
Таким образом, если вы хотите исключить ./oracle
, синтаксис должен быть:
find . -path ./oracle -prune -o -type f -size +390625 -exec ls -ldh {} +
То есть вызывайте -prune
только тогда, когда путь равен ./oracle
, а для любого другого файла проверяйте тип и размер и выполняйте ls
, если совпадает.
Из-за правил приоритета между -o
(или) и -a
(и; подразумевается, когда опущено между двумя предикатами), это фактически интерпретируется как:
find . '(' -path ./oracle -a -prune ')' -o \
'(' -type f -a -size +390625 -a -exec ls -ldh {} + ')'
Имейте в виду, что если вы опустите -exec...
, то действие по умолчанию — это -print
, но применимо ко всему выражению, как если бы вы написали:
find . '(' \
'(' -path ./oracle -a -prune ')' -o \
'(' -type f -a -size +390625 ')' \
')' -print
Таким образом, ./oracle
также будет напечатан (-prune
всегда возвращает истину). Поэтому вам потребуется явный -print
в этом случае:
find . -path ./oracle -prune -o -type f -size +390625 -print
Чтобы это было интерпретировано как:
find . '(' -path ./oracle -a -prune ')' -o \
'(' -type f -a -size +390625 -a -print ')'
Также обратите внимание, что -size +390625
соответствует файлам, чей фактический размер, округленный до целого числа 512-байтовых единиц, строго больше 390625, то есть файлам, размер которых 390625 * 512 + 1 = 200000001 байт или больше. Вы также можете использовать -size +200000000c
для этого, что более удобно читается как больше 200MB и работает для размеров, которые не обязательно кратны 512.
Ответ или решение
Когда вы работаете с командой find
в Solaris 10 и хотите исключить определенный каталог, например, /oracle
, необходимо правильно использовать флаги и операторы. Давайте подробно разберем, как корректно сформировать команду find
, чтобы найти все большие файлы в системе, исключив каталог /oracle
.
Проблема с командой
Исходная команда, указанная вами:
find . -type f -size +390625 -prune '/oracle' -exec ls -lh {} \;
содержит несколько ошибок. Ключевые моменты:
- Неправильный синтаксис:
-prune
не принимает аргументов напрямую. Он только указывает, чтоfind
не должен спускаться в каталог, когда он совпадает с указанным путем. - Путь к каталогу: Поскольку вы вызываете
find
из текущего каталога (.
), задача состоит в том, чтобы исключить путь, начинающийся с./oracle
, а не/oracle
.
Правильная команда
Корректная команда должна выглядеть следующим образом:
find . -path ./oracle -prune -o -type f -size +390625 -exec ls -lh {} +
Объяснение команды
Давайте разберем команду по частям:
find .
: Запускаем поиск из текущего каталога.-path ./oracle
: Указываетfind
на путь, который нужно исключить.-prune
: Если текущий путь совпадает с./oracle
,find
не будет заходить внутрь этого каталога.-o
: Оператор "или", который позволяет комбинировать условия.-type f
: Ищем только файлы (не каталоги).-size +390625
: Находим файлы размером более 390625 512-байтовых блоков (что эквивалентно файлам размером более 200MB).-exec ls -lh {} +
: Исполняем командуls -lh
для отображения информации о найденных файлах. Знак+
в конце указывает на то, что аргументы передаются в пакетном режиме.
Дополнительные уточнения
Если вы решите использовать оператор -print
, чтобы вывести только найденные файлы, без привязки к выполнению команды ls
, то правильная форма будет следующей:
find . -path ./oracle -prune -o -type f -size +390625 -print
Это гарантирует, что каталоги и файлы внутри ./oracle
не будут напечатаны.
Заключение
Формирование команды find
в Unix-подобной системе требует внимания к деталям в синтаксисе и логике выборки. Используя указанные рекомендации, вы сможете эффективно исключать определенные каталоги и находить файлы, соответствующие заданным критериям. Напоминание о том, что флаг -size
основывается на блоках по 512 байт, также важно учитывать при оценке необходимого размера файлов.
Если у вас возникнут дополнительные вопросы или потребуется более подробная помощь, не стесняйтесь обращаться.