A aspa dupla usada com o valor correspondente ao parâmetro -name em find

A aspa dupla usada com o valor correspondente ao parâmetro -name em find

Por que o valor correspondente ao parâmetro -namein finddeve ser marcado com aspas duplas?

# find / -type f -name *.out |wc -l 1>mv.out                                  
0403-027 The parameter list is too long.
# cat mv.out                                                   
       0
# find / -type f -name "*.out" |wc -l 1>mv.out                                   
# cat mv.out                                                                                           
  146302

Responder1

Sem aspas duplas, o *.outé expandido pelo shell, o que significa que é substituído por todos os nomes de arquivos no diretório atual que correspondem *.out(principalmente qualquer arquivo que termine .oute não comece com um ponto). No seu caso, parece haver pelo menos dois arquivos correspondentes que são passados find​​como parâmetros. findnão sabe o que fazer com eles e reclama que a lista de parâmetros é muito longa.

Ao citar o padrão, o shell deixa como está, apenas removendo as aspas e findvê um parâmetro intocado *.out, que é o que você provavelmente pretendia.

Responder2

Não tenho certeza se isso está exatamente correto. Mas acredito que colocá-lo entre aspas faz com que o analisador o leia como uma expressão regular. Sem aspas, acredito que o asterisco representa todos os arquivos do diretório atual.

Verifique a diferença na saída entre:

$ echo $(find ./ -name *)

e

$ echo $(find ./ -name "*")

Portanto, com o primeiro comando você provavelmente receberá um erro. Se você tiver os arquivosfoo&barno diretório atual, o asterisco representa os nomes dos arquivos. Portanto, o analisador de comandos leria o comando assim:

$ echo $(find ./ -name foo bar)

E a saída de erro seria find: bar: unknown primary or operator.

O segundo comando lê o asterisco como uma expressão regular, denotando a busca por qualquer nome de arquivo.

Editar:Embora agora, depois de testar mais os comandos, pareça no meu sistema que funciona quer o valor do argumento esteja ou não entre aspas, desde que algum texto seja combinado com o asterisco:

$ echo $(find ./ -name *foo)

é o mesmo que

$ echo $(find ./ -name "*foo")

Talvez eu tenha entendido mal a pergunta?

informação relacionada