Обратите внимание, что если вы делаете
find . -type f -name 'messages.*'
затем -print
подразумевается, когда все выражение (-type f -name 'messages.*'
) истинно, потому что нет «действия» (например, -exec
).
Хотя, чтобы прекратить спуск в определенные каталоги, вы должны использовать все, что соответствует этим каталогам, и следовать за ним -prune
(что предназначено для того, чтобы прекратить спуск в каталоги); вот так:
find . -type d -name '.svn' -prune
Это оценивается как True для каталогов .svn, и мы можем использовать логическое короткое замыкание, следуя этому по -o
(ИЛИ), после чего то, что следует после проверки -o
, проверяется только когда первая часть имеет значение False, следовательно, не каталог .svn. Другими словами, следующее:
find . -type d -name '.svn' -prune -o -name 'message.*' -exec grep -Iw uint {}
будет оценивать только то, что справа от -o
, а именно -name 'message.*' -exec grep -Iw uint {}
, для файлов, НЕ находящихся внутри каталогов .svn.
Обратите внимание, что, поскольку .svn
, скорее всего, всегда является каталогом (а не, например, файлом), и в этом случае, безусловно, не соответствует названию 'message. *', Вы могли бы также пропустить -type d
и сделать:
find . -name '.svn' -prune -o -name 'message.*' -exec grep -Iw uint {}
Наконец, обратите внимание, что если вы пропустите какое-либо действие (-exec
- это действие), произнесите так:
find . -name '.svn' -prune -o -name 'message.*'
тогда подразумевается действие -print
, но оно будет применяться к выражению WHOLE, включая часть -name '.svn' -prune -o
, и, таким образом, печатать все каталоги .svn, а также файлы 'message. *', Что, вероятно, не то, что вам нужно , Поэтому при использовании -prune
таким образом вы всегда должны использовать «действие» в правой части логического выражения. И когда это действие печатается, вы должны явно добавить его, например, так:
find . -name '.svn' -prune -o -name 'message.*' -print