Eles não são iguais. -print
primary é sempre avaliado como true e faz com que o nome do caminho atual seja gravado na saída padrão.
Quando você usa:
\( -type f -a -print -a -iname '*.mp3' \)
Todos os arquivos encontrados serão impressos no stdout, é o comportamento padrão de -print , independentemente da expressão -iname '*.mp3'
ser verdadeira ou falsa.
Quando você usa:
\( -type f -a -iname '*.mp3' -a -print \)
-print
parte só alcançada se -iname '*.mp3'
expressão for verdadeira. Portanto, apenas os arquivos que terminam com .mp3
serão impressos.
POSIX define encontrar um operador como:
expression [-a] expression
Conjunction of primaries; the AND operator is implied by the
juxtaposition of two primaries or made explicit by the optional -a
operator. The second expression shall not be evaluated if the first
expression is false.
Nesse caso, você não precisa usar -print
, porque se a expressão for verdadeira, -print
é adicionado por padrão:
If no expression is present, -print shall be used as the expression.
Otherwise, if the given expression does not contain any of the
primaries -exec, -ok, or -print, the given expression shall be
effectively replaced by:
( given_expression ) -print
Mas isso fará com que exclude_me seja impresso na saída, porque quando find
corresponde, -prune
faz com que a expressão seja avaliada como verdadeira. E desde quando omitimos -print
na segunda expresão, -print
é adicionado ao final de ambas as expressões. Parece:
find . \( -type d -name 'exclude_me' -prune \) -print -o \( -type f -a -iname '*.mp3' \) -print
Isso faz com que exclude_me seja impresso.
Você sempre pode omitir exclude_me na saída, adicionando explicitamente um -print
na segunda expressão. Isso faz com que -print
seja aplicado somente para a segunda expressão:
find . \( -type d -name 'exclude_me' -prune \) -o \( -type f -a -iname '*.mp3' \) -print
Ou adicionar uma expressão depois de -prune
e certifique-se de que a primeira expressão seja falsa:
find . \( -type d -name 'exclude_me' -prune -a -name . \) -o \( -type f -a -iname '*.mp3' \)