Se você entender os operadores &&
e ||
no shell
(e também em C, C ++ e linguagens derivadas),
então você entende -a
e -o
em find
.
Para refrescar sua memória:
No shell,
command1 && command2
executa command1
e, se ele ( command1
) for bem-sucedido,
ele (o shell) executa command2
.
command1 || command2
executa command1
e, se ele ( command1
) falhar,
ele (o shell) executa command2
.
Nas linguagens compiláveis,
expr1 && expr2
avalia expr1
. Se ( expr1
) for avaliado como falso (zero),
ele retorna isso como o valor da expressão geral.
Caso contrário (se expr1
for avaliado como um valor verdadeiro (diferente de zero)),
ele avalia expr2
e retorna isso como o valor da expressão geral.
expr1 || expr2
avalia expr1
. Se ( expr1
) for avaliado como um valor verdadeiro (diferente de zero),
ele retorna isso como o valor da expressão geral.
Caso contrário (se expr1
for avaliado como falso (zero))
ele avalia expr2
e retorna isso como o valor da expressão geral.
This is known as “short-circuit evaluation”, in that it allows the evaluation of a Boolean expression without evaluating terms whose values are not needed to determine the overall value of the expression.
Citações de encontrar (1)
GNUfind
searches the directory tree rooted at each given file name by evaluating the given expression from left to right, according to the rules of precedence (see section OPERATORS), until the outcome is known (the left hand side is false for and operations, true for or), at which pointfind
moves on to the next file name.
⋮EXPRESSIONS
The expression is made up of … tests (which return a true or false value), and actions (which have side effects and return a true or false value), all separated by operators. -and is assumed where the operator is omitted.
⋮⋮The subsection on ACTIONS states that -print, like
most of the actions, always returns a value of true.OPERADORES
⋮
expr1 expr2
expr1 -a expr2
expr1 i> -e expr2 ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ ⋅⋅⋅⋅⋅⋅⋅⋅⋅ não compatível com POSIXE; expr2 não é avaliado se expr1 for falso.
expr1 -o expr2
expr1 ou expr2 ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ não compatível com POSIXOu; expr2 não é avaliado se expr1 for verdadeiro.
A especificação de grupo aberto para find
tem coisas semelhantes a dizer:
The find utility shall recursively descend the directory hierarchy …, evaluating a Boolean expression composed of the primaries described in the OPERANDS section for each file encountered.
⋮OPERANDS
⋮The primary shall always evaluate as true; it shall cause the current pathname to be written to standard output.
⋮
The primaries can be combined using the following operators (in order of decreasing precedence):
⋮
expression [-a] expressionConjunction 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.
expression -o expressionAlternation of primaries; the OR operator. The second expression shall not be evaluated if the first expression is true.
Ambos os documentos dizem: “Se nenhuma expressão estiver presente, -print será usada como expressão.”
---------------- TL; DR ----------------
Então,
find -type d
é equivalente a
find -type d -print
que é equivalente a
find -type d -a -print
o que significa,
- para cada arquivo,
- avalie o teste
-type d
. - Se for verdade (ou seja, se o "arquivo" atual for um diretório),
avalie (execute) a ação
-print
.
- avalie o teste
Considerando que ,
find -print -type d
é equivalente a
find -print -a -type d
o que significa,
- para cada arquivo,
- avaliar (executar) a ação
-print
(isto é, isso acontece para todos os arquivos ) . - Se for verdadeiro (que
-print
sempre é), avalie o-type d
test. - E, como esse é o fim do comando,
o resultado do teste
-type d
é ignorado.
- avaliar (executar) a ação
Então você tem isso.