7

Я только что попробовал:

find . -name "*.[hc]" -print

а также

find . -name "*.[hc]"

Но оба вывода одинаковы, теперь -print бесполезен?

2 ответа2

15

Глядя на страницу руководства под FreeBSD, я вижу:

 -print  This primary always evaluates to true.  It prints the pathname of
         the current file to standard output.  If none of -exec, -ls,
         -print0, or -ok is specified, the given expression shall be
         effectively replaced by ( given expression ) -print.

Так что во многих случаях, -print не требуется. Однако рассмотрим это выражение, которое ищет файл с именем foo внутри somedir , но не внутри какого-либо каталога с именем .snapshot:

find somedir -name .snapshot -prune -o -name foo

Учитывая описание, указанное выше, оно будет преобразовано в:

find somedir ( -name .snapshot -prune -o -name foo ) -print

Что не совпадает с тем, что, вероятно, было задумано:

find somedir -name .snapshot -prune -o -name foo -print

Добавление скобок, чтобы сделать группу немного более очевидной, это:

find somedir ( -name .snapshot -prune ) -o ( -name foo -print )

Чтобы заметить разницу, обратите внимание, что -prune и -print оцениваются как true . Поэтому без указания -print первая версия будет распечатывать текущий файл, если совпадает либо -name .snapshot либо -name foo .

Вторая версия будет выводить текущий файл, только если -name foo соответствует.

Это многословный способ сказать, что -print обычно не требуется, если вы понимаете ситуации, в которых это необходимо.

0

Это также полезно, когда вы занимаетесь другими делами, но все же хотите посмотреть матчи.

Это общий вызов сценария для меня:

find . -name '*somepattern*' -print -delete

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .