Chỉ khớp mẫu regex trong filename.extension


2

Tôi cần sử dụng findđể xác định vị trí tệp phù hợp với mẫu biểu thức chính quy filename.extensionthay vì mặc định phù hợp /path/to/filename.extension.

Ví dụ:

/folder
  |--a-love-song.ogg
  |--a-jazz-song.ogg
  +--love-songs
       +--a-blues-song.ogg

Và tôi muốn tìm, trong /foldervà đó là các thư mục con, các tệp có .*love.*tên tệp:

debian@debian:~$ find folder -regex ".*love.*"
folder/a-love-song.ogg
folder/love-songs                   # Shouldn't be returned
folder/love-songs/a-blues-song.ogg  # Shouldn't be returned

Tôi đọc trang man và nhận ra có tùy chọn -name, chỉ tìm kiếm tên tệp, nhưng dường như nó không cho phép regex và -name -regexkhông hoạt động.

Tôi đã thử sử dụng regex để bỏ qua đường dẫn:

debian@debian:~$ find folder -regex "\/.*love.*$"

Nhưng nó đã không trả lại bất cứ điều gì. Tất nhiên ls | grepsẽ hoạt động, nhưng nó không trả về đường dẫn đến tệp mà tôi cần để biết tệp đó ở đâu.

Câu trả lời:


2

Bạn đề cập rằng lsvới grepsẽ hoạt động nếu bạn có đường dẫn đầy đủ đến tệp, làm thế nào findgrep? Vì greptrả về một dòng nếu tìm thấy kết quả khớp ở bất kỳ vị trí nào trong dòng đó, regex của bạn có thể khớp với thứ gì đó thiếu /s trước tên tệp và vẫn chứa chuỗi tìm kiếm của bạn.

$ find folder | grep -i '[^/]*love[^/]*\.[a-z0-9]*'

Điều đó dường như làm việc cho tôi. Có thể giảm kết quả khớp mở rộng nếu bạn biết tất cả các tiện ích mở rộng của mình thiếu số hoặc nếu bạn biết tất cả các tệp bạn muốn khớp có một tiện ích mở rộng cụ thể.


Ví dụ sử dụng

$ find folder
folder
folder/a-love-song.ogg
folder/love-songs
folder/love-songs/a-blues-song.ogg
folder/love-songs/another-love-song.ogg
$ find folder | grep -i '[^/]*love[^/]*\.[a-z0-9]*'
folder/a-love-song.ogg
folder/love-songs/another-love-song.ogg

Cố gắng giải thích về regex

  • [^/]*: Khớp với bất kỳ số lượng ký tự nào không /
  • love[^/]*: Khớp chuỗi lovevà sau đó bất kỳ số lượng ký tự không phải là/
  • \.[a-z0-9]*: Khớp a .và sau đó bất kỳ số chữ cái hoặc chữ số

Đặt cùng nhau, [^/]*love[^/]*\.[a-z0-9]*khớp với càng nhiều /ký tự không ở hai bên lovevới phần mở rộng được xử lý ở cuối. Cho chuỗi a/love/path/love-file.oggregex trên chỉ khớp love-file.ogg. Nếu một thư mục lá chứa love, ví dụ : a/path/love-leaf, nó không khớp bởi vì love-leafkhông chứa .các chữ cái hoặc số theo sau.


Khéo léo. Bạn có phiền giải thích những gì bạn đã làm ở đó không? Ý tôi là, phần regex.
Alex

@Alex Tôi có thể thử! Nếu bạn vẫn còn bối rối, tôi khuyên bạn nên dùng regrecal.com . Đó là một nguồn tài nguyên tuyệt vời để hình dung các biểu thức thông thường và những gì chúng khớp.
Mưa

0
find dir -regex '.*/[^/]*love[^/]*$'

Điều đó đã không trả lại bất cứ điều gì (có, tôi đã thay thế thư mục với thư mục).
Alex

Đã sửa lỗi regex.
grawity

@grawity Điều này vẫn trả về dir/love-songs(hoặc bất kỳ thư mục lá có lovetrong đó). Tôi không chắc liệu điều đó có thể xảy ra với những gì @Alex mong muốn hay findkhông.
Mưa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.