A pergunta pedia expressões regulares. O Bash e, portanto ls
, não suporta expressões regulares aqui. O que ele suporta são expressões de nome de arquivo ( Globbing ), uma forma de curingas. Expressões regulares são muito mais poderosas que isso.
Se você realmente deseja usar expressões regulares, pode usar o find -regex
seguinte:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'
A localização é recursiva por padrão, mas ls
não é. Para encontrar apenas arquivos no diretório atual, você pode desativar a recursão com -maxdepth 1
. Encontre correspondências no nome do arquivo com path, é por isso que os nomes de arquivos começam com ./
se você executar find in .
. O regex começa com \./
para lidar com isso. Observe que em uma regex, .
é um caractere especial que corresponde a qualquer caractere, mas aqui realmente queremos um ponto, é por isso que o escapamos com uma barra invertida. Fazemos o mesmo para o ponto in .txt
, porque a regex também corresponderia Atxt
. As classes de dígitos são as mesmas que para os globbing, apenas o que você precisa em ^
vez de !
inverter a classe de caracteres.
Se você deseja obter a saída de ls
, então você pode usar -exec ls
assim:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt' -exec ls -lah {} \;
find
suporta alguns tipos diferentes de expressões regulares. Você pode especificar um -regextype
, por exemplo:
find . -maxdepth 1 -regextype egrep -regex '\./.*[^0-9][0-9]\.txt'
Para mim, os tipos possíveis são: 'findutils-default', 'awk', 'egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic' , 'posix-egrep', 'posix-extended', 'posix-minimal-basic', 'sed' Você pode executar find -regextype help
para descobrir o que é suportado no seu sistema.
shopt -s extglob
.