Imagine uma árvore de origem. Existem arquivos xml em todos os lugares.
Mas como existe um XYZ.xml na raiz desta árvore, ele não encontrará meus arquivos xml.
find -iname *.xml
retorna
./XYZ.xml
ao invés de
./XYZ.xml
./a/b/c/bob.xml
./b/d/top.xml
man find
: Observe que você deve citar padrões com toda a certeza; caso contrário, o shell expandirá qualquer caractere curinga neles.Respostas:
Caso contrário, seu shell se expandirá
*.xml
paraXYZ.xml
, e o comando que realmente é executado éO motivo pelo qual funciona se não houver arquivos XML no diretório atual é que os shells geralmente deixam os curingas não expandidos se não corresponderem a nada. Em geral, qualquer hora que quiser curingas para ser expandida por um programa que não seja o shell (por exemplo, por
find
,tar
,scp
, etc.) que você precisa para citá-los para que o shell não vai tentar expandi-los em si.fonte
bash
, não defind
.Você precisa citar seu argumento assim:
para que seja passado para encontrar em vez de ser expandido pelo shell e depois para encontrar como a versão expandida.
fonte
*.xml
não corresponder a nada no diretório atual, ele será transmitido literalmente, e é por isso que funciona no outro caso. Resposta muito útil.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 exemplofile1.xml
file2.xml
file3.xml
, e depois o shell chamals
com a lista de argumentos resultantefile1.xml
file2.xml
file3.xml
. É por isso que você vê a mesma lista de nomes de arquivosecho *.xml
, mesmo queecho
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"
:find
,.
,-name
,*.xml
onde a*
é citado. Desde que*
é citado, é um caractere comum no que diz respeito ao shell.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
:find
,.
,-name
,*.xml
onde o*
não é citado.*.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.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émfile1.xml
,file2.xml
efile3.xml
:find
,.
,-name
,*.xml
onde o*
não é citado.*.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.find
com a lista resultante de argumentos, que é.
,-name
,file1.xml
,file2.xml
,file3.xml
.find
reclama de um erro de sintaxe quando é atingidofile2.xml
.Quando você executa
find . -name *.xml
e o diretório atual contém um único arquivo correspondentefile.xml
:find
,.
,-name
,*.xml
onde o*
não é citado.*.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.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 chamadosfile.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.)
fonte
Isso funciona no Solaris 10:
find /directory-to-search/* -prune -name "*gz"
fonte
.xml
.Tente por favor:
fonte
*
sempre deve ser citado ou escapado para passá-lo para encontrar.