Solaris 10 найти исключить каталог ‘oracle’

Вопрос или проблема

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

содержит несколько ошибок. Ключевые моменты:

  1. Неправильный синтаксис: -prune не принимает аргументов напрямую. Он только указывает, что find не должен спускаться в каталог, когда он совпадает с указанным путем.
  2. Путь к каталогу: Поскольку вы вызываете 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 байт, также важно учитывать при оценке необходимого размера файлов.

Если у вас возникнут дополнительные вопросы или потребуется более подробная помощь, не стесняйтесь обращаться.

Оцените материал
Добавить комментарий

Капча загружается...