Os curingas são expandidos pelo shell, não pelo comando. findé um dos poucos comandos que realiza a correspondência de curingas semelhante ao shell, em seu próprio tempo.
Quando você executa ls *.xml, primeiro o shell se expande *.xmlpara a lista de arquivos correspondentes, por exemplo file1.xml file2.xml file3.xml, e depois o shell chama lscom a lista de argumentos resultante file1.xml file2.xml file3.xml. É por isso que você vê a mesma lista de nomes de arquivos echo *.xml, mesmo que echonão saiba nada sobre arquivos e não se importe se seus argumentos são nomes de arquivos.
Quando você executa find . -name "*.xml":
- O shell analisa a linha de comando para reconhecer caracteres especiais e dividi-la em palavras e pontuação. Aqui há apenas uma lista de palavras
find, ., -name, *.xmlonde a *é citado. Desde que *é citado, é um caractere comum no que diz respeito ao shell.
- O shell executa o comando
findcom a lista especificada de argumentos: ., -name, *.xml.
findprocura por arquivos cujo nome corresponda ao padrão *.xmlem qualquer diretório no diretório atual.
Quando você executa find . -name *.xmle não há arquivos correspondentes *.xml:
- O shell analisa a linha de comando para reconhecer caracteres especiais e dividi-la em palavras e pontuação. Aqui há apenas uma lista de palavras
find, ., -name, *.xmlonde o *não é citado.
- Como a palavra
*.xmlcontém um caractere curinga sem aspas, o shell executa a geração do nome do arquivo. Como não há nomes de arquivos correspondentes, o padrão permanece não expandido.
- O shell executa o comando
findcom a lista resultante de argumentos, que é ., -name, *.xml.
findprocura por arquivos cujo nome corresponda ao padrão *.xmlem qualquer diretório no diretório atual.
Quando você executa find . -name *.xmle o diretório atual contém file1.xml, file2.xmle file3.xml:
- O shell analisa a linha de comando para reconhecer caracteres especiais e dividi-la em palavras e pontuação. Aqui há apenas uma lista de palavras
find, ., -name, *.xmlonde o *não é citado.
- Como a palavra
*.xmlcontém um caractere curinga sem aspas, o shell executa a geração do nome do arquivo: *.xmlé substituído pela lista de nomes de arquivos correspondentes.
- O shell executa o comando
findcom a lista resultante de argumentos, que é ., -name, file1.xml, file2.xml, file3.xml.
findreclama de um erro de sintaxe quando é atingido file2.xml.
Quando você executa find . -name *.xmle o diretório atual contém um único arquivo correspondente file.xml:
- O shell analisa a linha de comando para reconhecer caracteres especiais e dividi-la em palavras e pontuação. Aqui há apenas uma lista de palavras
find, ., -name, *.xmlonde o *não é citado.
- Como a palavra
*.xmlcontém um caractere curinga sem aspas, o shell executa a geração do nome do arquivo: *.xmlé substituído pela lista de nomes de arquivos correspondentes.
- O shell executa o comando
findcom a lista resultante de argumentos, que é ., -name, file.xml.
findvê um comando perfeitamente válido, mas provavelmente não é o que você pretendia: findé instruído a procurar arquivos chamados file.xmlem qualquer diretório, a não procurar por nenhum arquivo correspondente *.xml.
(A avaliação e expansão da Shell tem muitos outros recursos. Mencionei apenas os que são relevantes aqui.)
(O que descrevo é o comportamento padrão dos shells mais comuns: sh, bash, dash, ksh, ... Alguns shells podem ser configurados para exibir um erro em vez de executar um comando com curingas não expandidos ou para expandir curingas não correspondentes para um vazio Nenhuma delas ajudaria aqui.)
man find: Observe que você deve citar padrões com toda a certeza; caso contrário, o shell expandirá qualquer caractere curinga neles.