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 *.xml
para a lista de arquivos correspondentes, por exemplo file1.xml
file2.xml
file3.xml
, e depois o shell chama ls
com 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 echo
nã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
, *.xml
onde a *
é citado. Desde que *
é citado, é um caractere comum no que diz respeito ao shell.
- O shell executa o comando
find
com a lista especificada de argumentos: .
, -name
, *.xml
.
find
procura por arquivos cujo nome corresponda ao padrão *.xml
em qualquer diretório no diretório atual.
Quando você executa find . -name *.xml
e 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
, *.xml
onde o *
não é citado.
- Como a palavra
*.xml
conté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
find
com a lista resultante de argumentos, que é .
, -name
, *.xml
.
find
procura por arquivos cujo nome corresponda ao padrão *.xml
em qualquer diretório no diretório atual.
Quando você executa find . -name *.xml
e o diretório atual contém file1.xml
, file2.xml
e 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
, *.xml
onde o *
não é citado.
- Como a palavra
*.xml
conté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
find
com a lista resultante de argumentos, que é .
, -name
, file1.xml
, file2.xml
, file3.xml
.
find
reclama de um erro de sintaxe quando é atingido file2.xml
.
Quando você executa find . -name *.xml
e 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
, *.xml
onde o *
não é citado.
- Como a palavra
*.xml
conté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
find
com a lista resultante de argumentos, que é .
, -name
, file.xml
.
find
vê um comando perfeitamente válido, mas provavelmente não é o que você pretendia: find
é instruído a procurar arquivos chamados file.xml
em 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.