Risposte:
Che ne dite di:
ls *[!0-9][0-9].txt
L' !
inizio del gruppo completa il suo significato.
Come notato nei commenti, questo è bash, prova ad esempio:
printf "%s\n" *[!0-9][0-9].txt
ls
) non supporta le espressioni regolari qui. Queste sono espressioni di nome file (Globbing) . Puoi vedere la differenza già nel tuo esempio: qui *
c'è un carattere jolly, che non è presente nelle espressioni regolari, dove useresti .*
per ottenere lo stesso. Le espressioni regolari sono molto più potenti del globbing.
La domanda chiedeva espressioni regolari. Bash, e quindi ls
, non supporta le espressioni regolari qui. Ciò che supporta sono le espressioni del nome file ( Globbing ), una forma di caratteri jolly. Le espressioni regolari sono molto più potenti di così.
Se vuoi davvero usare le espressioni regolari, puoi usare find -regex
così:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'
Trova è ricorsivo per impostazione predefinita, ma ls
non lo è. Per trovare solo i file nella directory corrente, è possibile disabilitare la ricorsione con -maxdepth 1
. Trova corrispondenze con il nome file con percorso, ecco perché i nomi dei file iniziano con ./
se esegui find in .
. La regex inizia \./
con questo. Nota che in una regex .
c'è un personaggio speciale che si adatta a qualsiasi personaggio, ma qui vogliamo davvero un punto, ecco perché lo sfuggiamo con una barra rovesciata. Facciamo lo stesso per il punto in .txt
, perché altrimenti anche la regex corrisponderebbe Atxt
. Le classi di cifre sono le stesse del globbing, solo che è necessario ^
invece di !
invertire la classe di caratteri.
Se vuoi ottenere l'output di ls
, puoi usare in -exec ls
questo modo:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt' -exec ls -lah {} \;
find
supporta un paio di diversi sapori regex. È possibile specificare un -regextype
, ad esempio:
find . -maxdepth 1 -regextype egrep -regex '\./.*[^0-9][0-9]\.txt'
Per me, i tipi possibili sono: 'findutils-default', 'awk', 'egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic' , 'posix-egrep', 'posix-extended', 'posix-minimal-basic', 'sed' Puoi correre find -regextype help
per scoprire cosa è supportato sul tuo sistema.
Con i globs estesi ksh (o bash -O extglob
o zsh -o kshglob
) che stai già utilizzando, sarebbe:
ls -d -- ?(*[![:digit:]])[[:digit:]].txt
O
ls -d -- !(*[[:digit:]])[[:digit:]].txt
Se si desidera abbinare a1.txt
e,2.txt
ma non, a12.txt
né 12.txt
.
Tuttavia nota che in ksh e bash (a meno che tu non imposti l' failglob
opzione per ottenere un comportamento simile a quello di zsh), se quel modello non corrisponde a nessun file, il modello verrà passato letteralmente a ls
, e se quel file (dal nome strano) succede a esiste, verrà elencato ls
anche se non corrisponde al modello stesso.
Per includere .2.txt
, imposta l' dotglob
opzione in bash
, aggiungi il (D)
qualificatore glob in zsh
oppure imposta FIGNORE
su !(.|..)
in ksh93
.
shopt -s extglob
.