Câu hỏi yêu cầu biểu thức chính quy. Bash, và do đó ls
, không hỗ trợ các biểu thức thông thường ở đây. Những gì nó hỗ trợ là biểu thức tên tệp ( Globbing ), một dạng ký tự đại diện. Biểu thức thông thường mạnh hơn rất nhiều so với điều đó.
Nếu bạn thực sự muốn sử dụng các biểu thức thông thường, bạn có thể sử dụng find -regex
như thế này:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'
Tìm được đệ quy theo mặc định, nhưng ls
không. Để chỉ tìm các tệp trong thư mục hiện tại, bạn có thể tắt đệ quy với -maxdepth 1
. Tìm kết quả khớp với tên tệp có đường dẫn, đó là lý do tại sao tên tệp bắt đầu bằng ./
nếu bạn chạy find in .
. Regex bắt đầu với \./
để đối phó với điều đó. Lưu ý rằng trong regex, .
là một ký tự đặc biệt khớp với bất kỳ ký tự nào, nhưng ở đây chúng tôi thực sự muốn có một dấu chấm, đó là lý do tại sao chúng tôi thoát khỏi nó bằng dấu gạch chéo ngược. Chúng tôi làm tương tự cho dấu chấm trong .txt
, bởi vì biểu thức chính quy cũng sẽ khớp Atxt
. Các lớp chữ số giống như đối với toàn cầu, chỉ là bạn cần ^
thay vì !
đảo ngược lớp ký tự.
Nếu bạn muốn có được đầu ra của ls
, thì bạn có thể sử dụng -exec ls
như thế này:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt' -exec ls -lah {} \;
find
hỗ trợ một vài hương vị regex khác nhau. Bạn có thể chỉ định một -regextype
, ví dụ:
find . -maxdepth 1 -regextype egrep -regex '\./.*[^0-9][0-9]\.txt'
Đối với tôi, các loại có thể là: 'findutils-default', 'awk', 'egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic' , 'posix-egrep', 'posix-Extended', 'posix-Minimal-basic', 'sed' Bạn có thể chạy find -regextype help
để tìm hiểu những gì được hỗ trợ trên hệ thống của bạn.
shopt -s extglob
.