Preferência do operador em um comando find?

6

Veja o exemplo abaixo:

$ ls -1p
appledir/
applefile
orangedir/
orangefile
$ find . -type f -name apple\*
./applefile
$ find . -type f -name orange\*
./orangefile
$ find . -type f -name apple\* -o -name orange\*
./applefile
./orangedir
./orangefile
$ find . -type f \( -name apple\* -o -name orange\* \)
./applefile
./orangefile
$ 

Fiquei surpreso ao descobrir que precisava dos parênteses para que isso funcionasse como esperado; aparentemente eu não internalizei a regra de precedência pela qual find avalia seus argumentos.

Como posso prever facilmente quando e quando não precisarei usar parênteses para agrupar explicitamente find primários?

Em outras palavras, quais são as regras pelas quais eu posso imaginar find inserindo parênteses nos comandos que eu dou, o que me permitirá prever com precisão como ele irá avaliar expressões desagrupadas? / p>     

por Wildcard 15.04.2016 / 00:29

1 resposta

8

De acordo com a documentação ,

Please note that -a when specified implicitly (for example by two tests appearing without an explicit operator between them) or explicitly has higher precedence than -o. This means that find . -name afile -o -name bfile -print will never print afile.

Então, basicamente, você pode imaginar find em torno de duas expressões "anded" com parênteses por padrão. Seu

find . -type f -name apple\* -o -name orange\*

é interpretado como

find . \( -type f -name apple\* \) -o -name orange\*
    
por 15.04.2016 / 00:33

Tags