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 -regex
seperti ini:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'
Find bersifat rekursif secara default, tetapi ls
tidak. 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 ls
seperti ini:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt' -exec ls -lah {} \;
find
mendukung 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 help
untuk mencari tahu apa yang didukung pada sistem Anda.
shopt -s extglob
.