Risposte:
Le espressioni regolari e il globbing dei nomi dei file sono due cose molto diverse.
Le espressioni regolari vengono utilizzate nei comandi / funzioni per la corrispondenza dei motivi nel testo. Ad esempio nel parametro pattern grep
o nei linguaggi di programmazione.
Il globbing del nome file viene utilizzato dalle shell per abbinare i nomi di file e directory utilizzando i caratteri jolly. Le capacità di globbing dipendono dalla shell. Bash, ad esempio, supporta i caratteri jolly come:
*
abbina 0 o più caratteri?
abbina 1 personaggio[...]
abbina un personaggio nel set specificatoQuesti caratteri jolly possono sembrare simili alle espressioni regolari, infatti [...]
hanno lo stesso significato in globbing e regex. Ma *
e ?
significano cose diverse in globbing e regex.
In un commento hai scritto:
ma in che modo la differenza dell'interprete * sia che si tratti di joker o regex? per esempio
grep a*b a*.txt
:?
Facile. Una specie di.
Prima di tutto, la shell cerca di interpretare i caratteri jolly, abbinandoli a nomi di file. Se ci sono file che iniziano con "a" e terminano con "b", la shell sostituirà a*b
con i nomi di file corrispondenti. Lo stesso vale per a*.txt
. Se non ci sono nomi di file corrispondenti, la shell passerà gli argomenti grep
come erano, letteralmente.
Tuttavia, il primo parametro di grep
dovrebbe essere un modello. Nel 99,999% dei casi d'uso pratici non si desidera che il primo parametro venga interpretato dalla shell. Quindi molto probabilmente l'intenzione era questa:
grep "a*b" a*.txt
Grazie alla citazione a*b
, la shell non lo interpreterà usando il globbing e invece lo passerà direttamente a grep
. A sua volta, grep
lo interpreterà come un'espressione regolare (in base alla progettazione).
Per riassumere, la shell interpreta la riga di comando seguendo il suo linguaggio globbing, che utilizza i caratteri jolly. Comandi, i programmi interpretano i loro parametri in qualunque modo siano stati progettati dai loro autori.
Se un nome file è una stringa per te, puoi usare regex anche per i nomi dei file. Ad esempio: se vuoi trovare nomi di file corrispondenti a una regex puoi provare:
find ./ -regex '.*[abc][xyz].*'
Il comando cerca i file che hanno a, b o c nel nome seguito da x, y o z. Questo è solo un esempio. Ci sono infinite possibilità.
find ./ -name 'a*'
usi * come carattere jolly. Quando digiti find ./ -regex 'a*'
, usi * in una regex. La differenza importante è l'interruttore -name
o -regex
.