Risposte:
Globbing del nome del file Shell e le espressioni regolari usano alcuni degli stessi caratteri e hanno scopi simili, ma hai ragione, non sono compatibili. Il globbing dei nomi di file è un sistema molto meno potente.
Nel nome del file globbing:
* significa "zero o più caratteri"
? significa "qualsiasi singolo carattere"
Ma nelle regex devi usare .*"zero o più caratteri", e. significa "qualsiasi singolo carattere". A ?significa qualcosa di molto diverso nelle regex: zero o un'istanza dell'elemento RE precedente.
Le parentesi quadre ( []) sembrano funzionare allo stesso modo in entrambi i sistemi sul sistema su cui sto scrivendo, almeno per casi semplici. Ciò include cose come le classi di caratteri POSIX (ad es [:alpha:].). Detto questo, se hai bisogno che i tuoi comandi funzionino su molti diversi tipi di sistema, ti consiglio di non usare nulla al di là di cose elementari come elenchi di caratteri (ad es.[abeq] ) e forse intervalli di caratteri (ad esempio [a-c]).
Queste differenze significano che i due sistemi sono direttamente intercambiabili solo per casi semplici. Se hai bisogno della corrispondenza regex dei nomi dei file, devi farlo in un altro modo. find -regexè un'opzione. (Si noti che esiste anche find -name, tra l'altro, che utilizza la sintassi glob.)
'%'significa '*'.
Risposta alla domanda espressa nel titolo originale:
Perché le espressioni regolari differiscono da quelle utilizzate per filtrare i file?
L'espansione del nome file precede le espressioni regolari, esisteva già con la maggior parte dei sistemi operativi (caratteri jolly / joker) ed è molto più semplice e intuitiva di quest'ultima.
Sebbene *.txtsia facilmente comprensibile da utenti occasionali, l'analogo .*\.txtè qualcosa di più mirato a utenti / programmatori esperti, per non parlare ^.*\.txt$...
*.txtnon è uguale .*\.txt, è (principalmente) uguale .*\.txt$perché non ci può essere nulla dopo il .txt(almeno assumendo ragionevoli globbing dei nomi di file). Forse anche ^.*\.txt$un po 'a seconda dell'uso. Dimostra il tuo punto?