Por que a ordem dos parâmetros afeta os arquivos encontrados por 'find'?

2

Eu encontrei esse comportamento estranho em find . Dependendo da ordem dos parâmetros para find , ele encontra arquivos diferentes.

Por exemplo, tenho uma árvore de diretórios com o seguinte conteúdo.

.
├── configure.ac
├── Makefile.am
└── src
    ├── hello.c
    └── Makefile.am

se eu correr

find -name '*.cpp' -o -name '*.[chS]' -print0 | xargs -0 echo

Lista

./src/hello.c

E se eu correr

find -name '*.[chS]' -o -name '*.cpp' -print0 | xargs -0 echo

Não lista nada. Observe que a única coisa que eu mudei é a ordem do nome do arquivo.

Alguém pode explicar por que o segundo comando não lista nenhum arquivo?

    
por Kotte 22.04.2014 / 17:15

1 resposta

3

A ação -print0 é vinculada apenas ao segundo -name "filtro" (teste na expressão de referência), portanto, só imprimirá algo se o segundo filtro corresponder. Isso ocorre porque o operador padrão na expressão de localização é and e se liga mais do que or ( -o ). ou seja, sua segunda expressão é avaliada como:

find -name '*.[chS]' -o \( -name '*.cpp' -print0 \) | xargs -0 echo

Tente agrupar os filtros:

find \( -name '*.[chS]' -o -name '*.cpp' \) -print0 | xargs -0 echo

Você também pode fazer isso se quiser:

find -name '*.[chS]' -print0 -o -name '*.cpp' -print0 | xargs -0 echo
    
por 22.04.2014 / 17:20

Tags