Por que o valor correspondente ao parâmetro -name
in find
deve 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 .out
e não comece com um ponto). No seu caso, parece haver pelo menos dois arquivos correspondentes que são passados find
como parâmetros. find
nã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 find
vê 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?