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 *.xml
a 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
, scp
e 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.
*.xml
non 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 *.xml
all'elenco dei file corrispondenti, ad esempio file1.xml
file2.xml
file3.xml
, quindi la shell chiama ls
con 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 echo
non sa nulla dei file e non importa se i suoi argomenti sono nomi di file.
Quando corri find . -name "*.xml"
:
find
, .
, -name
, *.xml
dove il *
è citato. Dal momento che *
è citato, è un personaggio ordinario per quanto riguarda la shell.find
con l'elenco specificato di argomenti: .
, -name
, *.xml
.find
cerca i file il cui nome corrisponde al modello *.xml
in qualsiasi directory nella directory corrente.Quando esegui find . -name *.xml
e non ci sono file corrispondenti *.xml
:
find
, .
, -name
, *.xml
dove la *
non è citato.*.xml
contiene 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.find
con l'elenco risultante degli argomenti, che è .
, -name
, *.xml
.find
cerca i file il cui nome corrisponde al modello *.xml
in qualsiasi directory nella directory corrente.Quando si esegue find . -name *.xml
e la directory corrente contiene file1.xml
, file2.xml
e file3.xml
:
find
, .
, -name
, *.xml
dove la *
non è citato.*.xml
contiene un carattere jolly non quotato, la shell esegue la generazione del nome file: *.xml
viene sostituita dall'elenco dei nomi file corrispondenti.find
con l'elenco risultante degli argomenti, che è .
, -name
, file1.xml
, file2.xml
, file3.xml
.find
si lamenta di un errore di sintassi quando raggiunge file2.xml
.Quando si esegue find . -name *.xml
e la directory corrente contiene un singolo file corrispondente file.xml
:
find
, .
, -name
, *.xml
dove la *
non è citato.*.xml
contiene un carattere jolly non quotato, la shell esegue la generazione del nome file: *.xml
viene sostituita dall'elenco dei nomi file corrispondenti.find
con l'elenco risultante degli argomenti, che è .
, -name
, file.xml
.find
vede un comando perfettamente valido, ma probabilmente non è quello che volevi: ti find
viene detto di cercare i file chiamati file.xml
in 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.