Immagina un albero delle fonti. Ci sono file xml ovunque.
Ma poiché c'è un XYZ.xml nella radice di questo albero, non troverà i miei file xml.
find -iname *.xml
ritorna
./XYZ.xml
invece di
./XYZ.xml
./a/b/c/bob.xml
./b/d/top.xml
Immagina un albero delle fonti. Ci sono file xml ovunque.
Ma poiché c'è un XYZ.xml nella radice di questo albero, non troverà i miei file xml.
find -iname *.xml
ritorna
./XYZ.xml
invece di
./XYZ.xml
./a/b/c/bob.xml
./b/d/top.xml
Risposte:
find -iname '*.xml'
In caso contrario, i tuoi si espande shell *.xmla XYZ.xml, e il comando che in realtà viene eseguito è
find -iname XYZ.xml
Il motivo per cui funziona se non ci sono file XML nella directory corrente è che le shell generalmente lasciano caratteri jolly non espansi se non corrispondono a nulla. In generale, ogni volta che si desidera caratteri jolly per essere ampliato con un programma diverso dal shell (ad esempio da find, tar, scpe così via) è necessario citarli in modo che la shell non cercherà di espandere il loro sé.
bash, non di find.
Devi citare il tuo argomento in questo modo:
find ./ -name '*.xml'
in modo che venga passato per trovare invece di essere espanso dalla shell, quindi passato per trovare come versione espansa.
*.xmlnon corrisponde a nulla nella directory corrente, viene trasmesso letteralmente, motivo per cui funziona nell'altro caso. Risposta molto utile
I caratteri jolly vengono espansi dalla shell, non dal comando. findè uno dei pochi comandi che esegue la corrispondenza dei caratteri jolly simile alla shell, a suo tempo.
Quando si esegue ls *.xml, prima la shell si espande *.xmlall'elenco dei file corrispondenti, ad esempio file1.xml file2.xml file3.xml, quindi la shell chiama lscon l'elenco di argomenti risultante file1.xml file2.xml file3.xml. Ecco perché vedi lo stesso elenco di nomi di file echo *.xml, anche se echonon sa nulla dei file e non importa se i suoi argomenti sono nomi di file.
Quando corri find . -name "*.xml":
find, ., -name, *.xmldove il *è citato. Dal momento che *è citato, è un personaggio ordinario per quanto riguarda la shell.findcon l'elenco specificato di argomenti: ., -name, *.xml.findcerca i file il cui nome corrisponde al modello *.xmlin qualsiasi directory nella directory corrente.Quando esegui find . -name *.xmle non ci sono file corrispondenti *.xml:
find, ., -name, *.xmldove la *non è citato.*.xmlcontiene un carattere jolly non quotato, la shell esegue la generazione del nome file. Poiché non ci sono nomi di file corrispondenti, il modello rimane non espanso.findcon l'elenco risultante degli argomenti, che è ., -name, *.xml.findcerca i file il cui nome corrisponde al modello *.xmlin qualsiasi directory nella directory corrente.Quando si esegue find . -name *.xmle la directory corrente contiene file1.xml, file2.xmle file3.xml:
find, ., -name, *.xmldove la *non è citato.*.xmlcontiene un carattere jolly non quotato, la shell esegue la generazione del nome file: *.xmlviene sostituita dall'elenco dei nomi file corrispondenti.findcon l'elenco risultante degli argomenti, che è ., -name, file1.xml, file2.xml, file3.xml.findsi lamenta di un errore di sintassi quando raggiunge file2.xml.Quando si esegue find . -name *.xmle la directory corrente contiene un singolo file corrispondente file.xml:
find, ., -name, *.xmldove la *non è citato.*.xmlcontiene un carattere jolly non quotato, la shell esegue la generazione del nome file: *.xmlviene sostituita dall'elenco dei nomi file corrispondenti.findcon l'elenco risultante degli argomenti, che è ., -name, file.xml.findvede un comando perfettamente valido, ma probabilmente non è quello che volevi: ti findviene detto di cercare i file chiamati file.xmlin qualsiasi directory, di non cercare alcuna corrispondenza di file *.xml.(La valutazione e l'espansione della shell hanno molte altre funzionalità. Ho citato solo quelle rilevanti qui.)
(Quello che descrivo è il comportamento predefinito delle shell più comuni: sh, bash, dash, ksh, ... Alcune shell possono essere configurate per visualizzare un errore invece di eseguire un comando con caratteri jolly non espansi o per espandere un carattere jolly non corrispondente in un vuoto elenco. Nessuno di questi sarebbe di aiuto qui.)
Funziona su Solaris 10:
find /directory-to-search/* -prune -name "*gz"
.xml.
Vi preghiamo di provare:
find ./ -name *.xml
*dovrebbe sempre essere quotate o sfuggiti a passarlo da trovare.
man find: Nota che dovresti ovviamente citare i pattern, altrimenti la shell espanderà tutti i caratteri jolly in essi.