Questão (Ubuntu / Linux) comando “find” fornece resultados diferentes baseados em aspas


Eu estava usando

find -iname *prib*

e obtendo apenas um resultado "./prib09jack.pdf" com

find -iname "*prib*" 

Eu recebo muitos mais resultados que eu estava procurando, como

./Dir1/PRIB09/prib09jackTFF1.pdf

e muito mais, mas por que importava que as aspas estivessem por perto?Prib"?

Melhor.


4


origem


Você iniciou o comando no mesmo diretório e obteve respostas diferentes? Qual foi toda a estrutura de comando de localização que você usou, pois há muitas opções que afetam o resultado. - dtlussier
Eu estava no mesmo diretório para cada uso, alterando apenas as cotações ao redor da string de pesquisa. - Vass


Respostas:


Se houver um arquivo (ou arquivos) correspondente *prib* no diretório atual quando o comando find for executado, o shell expandirá o curinga para corresponder primeiro ao (s) nome (s) do arquivo antes de enviar os argumentos para encontrare resultar em um comando diferente sendo executado do que o usuário espera.

Por exemplo,

$ ls foo*
foobar

$ find -iname foo*
./foobar

$ find -iname "foo*"
./foobar
./dir/foobz
./dir2/fooblat

Em suma, as cotações atrasam a interpretação de curingas para o comando find executar. A falta de cotações se expande imediatamente.


10



uau, isso foi profundo. Eu não posso dizer que eu entendi completamente. Então eu sempre deveria estar usando as citações em situações semelhantes? O que você disse soou como se encontrasse uma string correspondente a uma forma do caractere curinga. Mais pesquisas seguem essa expansão inicial de caractere curinga. E que as citações impedem que isso aconteça. (se não me engano a página do homem não diz nada para evitar tal erro). - Vass
Você acharia explicado no bash página man, não o find man page, porque as citações são tratadas pelo shell. Basicamente (para repetir o que o kmarsh disse), se você usa *prib* sem aspas, o bash procura arquivos no diretório atual com nomes correspondentes a esse padrão e substitui *prib* com os nomes dos arquivos antes de invocar find. Se você usa aspas, o bash deixa o *prib* sozinho. - David Z
@Vass: você pode usar echo *prib* e tal para ver o que o bash faz com os argumentos antes de passá-los para o comando. echo em si apenas imprime seus argumentos inalterados, por isso é a saída diz-lhe o que bash expandiu o *prib*. - sth
@sth zaw. Muito obrigado. isso foi a abertura dos olhos. Muito obrigado por se preocupar em me dizer isso. É como se houvesse uma outra dimensão na linha de comando que eu desconhecia. - Vass
@David, obrigado pela elaboração, e @Vass, feliz por ajudar e obrigado pela resposta aceita. @ bom ponto, eu também uso o eco quando eu quero ver o que vai acontecer com a expansão curinga. - kmarsh


O problema é que seu shell está expandindo o curinga * antes de entregá-lo para encontrá-lo. Você quer encontrar para obtê-los, então você precisa escapar deles. As citações fazem isso, ou você poderia fazer

find -iname \*iprib\*

e funcionaria também. A principal coisa é, você quer que os curingas façam com que ele seja não interpretado por qualquer outra coisa ao longo do caminho (como o seu shell).


1