De acordo com find
a página man do , OR é usado com expressões:
expr1 -o expr2
Or; expr2 is not evaluated if expr1 is true.
Por que então também funciona com ações como -print
, como neste exemplo?
find . -type d -exec sh -c 'printf "%s/\n" "$0"' {} \; -or -print
As ações também são expressões ; são expressões que têm um efeito colateral. ( POSIX nem sequer menciona ações.)
No
-exec
caso de , o valor da expressão reflete o status do comando que é executado: se for bem-sucedido, indicado por um código de saída 0, o valor da expressão é verdadeiro, caso contrário, é falso. Entãorecua do diretório atual; para arquivos que são diretórios, ele executa
sh
para executarprintf
(adicionando uma barra após o diretório); para todo o resto, ele executafind
aprint
ação de . O-or
é uma disjunção entre-type d -exec ...
e-print
; o valor que importa aqui é-type d
's, não-exec
's.Mais detalhadamente,
find
as regras de precedência de ' significam quepode ser escrito mais explicitamente como
-or
As associações de expressões são respectivamentee
Todo o conjunto de expressões é avaliado para cada arquivo (no sentido geral do termo, ou seja , incluindo diretórios etc.), começando da esquerda:
-type d
é avaliado como true se o arquivo atual for um diretório, caso contrário, false.-exec ...
é avaliado se a expressão anterior for verdadeira, portanto, se o arquivo atual for um diretório; sua avaliação envolve a execuçãosh -c 'printf "%s/\n" "$0"'
com o arquivo atual como argumento, e o resultado é true sesh
sair com status 0, false caso contrário.-print
é avaliado se o resultado da expressão anterior (ambos-type
e-exec
) for false , ou seja , o arquivo atual não é um diretório ou é, massh
falhou.Um pequeno
-o
comuta completamente a saída; existem dois arquivos (contendo "111" e "2 2") e dois diretórios não catáveis correspondentes a 'test*'O primeiro (implícito
-a
) faz o-print
após cada sucesso-exec
. Para dirs, a mensagem de erro é redirecionada e o -print não é "avaliado" - a cadeia AND lógica está quebrada.O segundo ("cat OR print") imprime apenas em caso de falha.
O exemplo da ameixa está escondido em man find; Tive dificuldade em entender.
Essas listas AND-OR são complicadas, e também a precedência é importante, e logo você precisará desses bons arquivos
\(parens\)
. Find faz linhas de comando feias, mas consultas agradáveis!