Pertanyaan itu meminta ekspresi reguler. Bash, dan karenanya ls, tidak mendukung ekspresi reguler di sini. Apa yang didukungnya adalah ekspresi nama file ( Globbing ), suatu bentuk wildcard. Ekspresi reguler jauh lebih kuat dari itu.
Jika Anda benar-benar ingin menggunakan ekspresi reguler, Anda dapat menggunakan find -regexseperti ini:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'
Find bersifat rekursif secara default, tetapi lstidak. Untuk hanya menemukan file di direktori saat ini, Anda dapat menonaktifkan rekursi -maxdepth 1. Temukan kecocokan dengan nama file dengan path, itu sebabnya nama file dimulai dengan ./jika Anda menjalankan find in .. Regex dimulai dengan \./mengatasinya. Perhatikan bahwa dalam sebuah regex, .adalah karakter khusus yang cocok dengan karakter apa pun, tetapi di sini kami benar-benar menginginkan sebuah titik, itulah sebabnya kami menghindarinya dengan backslash. Kami melakukan hal yang sama untuk titik masuk .txt, karena regex juga akan cocok Atxt. Kelas digit sama dengan untuk globbing, hanya saja Anda perlu ^alih-alih !membalikkan kelas karakter.
Jika Anda ingin mendapatkan output ls, maka Anda dapat menggunakan -exec lsseperti ini:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt' -exec ls -lah {} \;
findmendukung beberapa rasa regex yang berbeda. Anda dapat menentukan -regextype, misalnya:
find . -maxdepth 1 -regextype egrep -regex '\./.*[^0-9][0-9]\.txt'
Bagi saya, tipe yang mungkin adalah: 'findutils-default', 'awk', 'egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic' , 'posix-egrep', 'posix-extended', 'posix-minimal-basic', 'sed' Anda dapat menjalankan find -regextype helpuntuk mencari tahu apa yang didukung pada sistem Anda.
shopt -s extglob.