Um comportamento estranho para globbing no comando find

2

Em está globbing um recurso do shell?

Aprendi a usar o comando globbing in find, mas hoje vi um comportamento estranho.

quando estou em qualquer lugar, exceto a localização da minha pesquisa, não preciso de aspas simples ou duplas para globbing

$ pwd
/home
$ find / -name *c
...
it is ok

mas

$ pwd
/
$ find / -name *c
find: paths must precede expression: proc
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

O que acontece?

    
por Sinoosh 26.09.2016 / 10:37

1 resposta

11

Quando você usa * sem aspas (ou sem escape), ou seja, token glob * (qualquer número de caracteres, ou seja, qualquer arquivo), o shell expande * para todos os arquivos no diretório fornecido, no caso de *c , todos os arquivos terminados em c . Então, quando você corre:

find / -name *c

assumindo que haja três arquivos .c no diretório atual, ou seja, foo.c , bar.c e spam.c , o comando que realmente seria executado é:

 find / -name foo.c bar.c spam.c

que é um comando inválido, como você pode ver, ele está usando vários nomes de arquivos após a única opção -name . Isso é o que acontece quando você está em / .

Agora, em /home , presumivelmente não havia arquivos *c presentes, portanto, o padrão de glob *c será mantido (em bash , isso é comportamento dependente de shell; em bash , você pode altere o comportamento padrão por nullglob / failglob shell options), então o comando find gets é:

 find / -name *c

que é um comando válido e, espera-se, será executado.

Agora, com find , você deve citar ou escapar de qualquer token de globalização de concha, já que você quer que find interprete (expanda) esses, não antes pelo shell. Então faça qualquer um de:

find / -name '*c'
find / -name "*c"
find / -name \*c
    
por heemayl 26.09.2016 / 10:45