Come `trova. -name * foo * `lavoro?


8

Ho pensato che il carattere jolly *nel comando find . -name *foo*fosse sostituito da bash, eppure il comando funziona a meno che non *foo*corrisponda a qualcosa nella directory corrente, quindi non lo fa. È confusionario.


3
Nota: se lo si sostituisce find . -name *foo*con find . -name '*foo*', i match con i caratteri jolly funzioneranno come previsto.
Bill

Risposte:


14

Se bash non riesce a trovare una corrispondenza, passa la stringa letterale all'applicazione con *s non espanso. Per esempio:

$ ls
foo

$ cat /tmp/test
echo $1

$ /tmp/test *foo*
foo

$ /tmp/test *bar*
*bar*

bashespanso *foo*perché corrispondeva, ma passava *bar*direttamente perché non lo faceva. L' nullglobopzione dirà a bash di risolvere invece schemi non corrispondenti nella stringa vuota:

$ shopt -s nullglob
$ /tmp/test *bar*

$

1
Un piccolo commento per dire che zsh non ha lo stesso comportamento di default, restituisce un errore: zsh: no matches found.
Stéphane Gimenez,

zsh deve no_nomatchattivare questo comportamento.
chx,

5

Se si desidera findottenere la stringa non espansa, è possibile citarla o proteggere i caratteri jolly con barre rovesciate.

$ ls
foo

$ cat /tmp/test
echo $1

$ /tmp/test '*foo*'
*foo*

$ /tmp/test \*foo\*
*foo*
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.