2012-09-24 36 views
5

Tôi có một thư mục (Linux/Unix) trên Apache Server với rất nhiều thư mục con có chứa rất nhiều các tập tin như thế này:Làm cách nào để tìm tất cả các tệp trong Thư mục có grep và regex?

 
- Dir 
    - 2010_01/ 
    - 142_78596_101_322.pdf 
    - 12_10.pdf 
    - ... 
    - 2010_02/ 
    - ... 

Làm thế nào tôi có thể tìm thấy tất cả các file với filesnames trông như: *_*_*_*.pdf? nơi * luôn là một chữ số !!

tôi cố gắng giải quyết nó như thế này:

ls -1Rl 2010-01 | grep -i '\(\d)+[_](\d)+[_](\d)+[_](\d)+[.](pdf)$' | wc -l 

Nhưng biểu hiện thường xuyên \(\d)+[_](\d)+[_](\d)+[_](\d)+[.](pdf)$ không làm việc với grep.

Chỉnh sửa 1: Thử ví dụ ls -l 2010-03 | grep -E '(\d+_){3}\d+\.pdf' | wc -l chỉ trả về giá trị rỗng. Vì vậy, nó không hoạt động hoàn hảo

+1

\ d nghĩa là chữ số, vì vậy regex bạn đang tìm kiếm: digits_digits_digits_digits.pdf. Loại tên tệp nào bạn không muốn khớp? –

+0

oh xin lỗi ... tôi đã chỉnh sửa bài đăng của tôi – trouble

+0

Bạn đang cố gắng khớp '12_10.pdf' hoặc chỉ' 142_78596_101_322.pdf' trong ví dụ? –

Trả lời

0

Cảm ơn đến gbchaosmastercon sói Tôi tìm cách phù hợp với mình:

vào một thư mục:

find . | grep -P "(\d+_){3}\d+\.pdf" | wc -l 

Tại Root Directory:

find 20*/ | grep -P "(\d+_){3}\d+\.pdf" | wc -l 
3

Hãy thử sử dụng find.

Lệnh thỏa mãn đặc tả của bạn __*_*.pdf where * is always a digit:

find 2010_10/ -regex '__\d+_\d+\.pdf' 

Bạn dường như muốn một chuỗi 4 số cách nhau bằng dấu gạch dưới, tuy nhiên, dựa trên các regex mà bạn đã cố gắng.

(\d+_){3}\d+\.pdf 

Hoặc bạn có muốn khớp với tất cả các tên chỉ chứa số/gạch dưới không?

[\d_]+\.pdf 
+0

Stackoverflow định dạng đã xóa một số ký tự! các tập tin có định dạng '* _ * _ * _ *. pdf' Tôi sẽ thử regex bạn đăng !! – trouble

+0

tôi thử '(\ d + _) {3} \ d + \. Pdf' với tìm và grep mà không thành công !! – trouble

+1

Tôi không ở trong môi trường mà tôi có thể kiểm tra điều này, nhưng bạn có thể cần thêm cờ '-regextype posix-extended' vào lệnh' find'. – vinnydiehl

1

Trước tiên, bạn nên sử dụng egrep vs grep hoặc gọi grep với -E cho mẫu mở rộng.

Vì vậy, các công trình này cho tôi:

$ cat test2.txt 
- Dir 
    - 2010_01/ 
    - 142_78596_101_322.pdf 
    - 12_10.pdf 
    - ... 
    - 2010_02/ 
    - ... 

Bây giờ egrep tập tin đó:

cat test2.txt | egrep '((?:\d+_){3}(?:\d+)\.pdf$)' 
- 142_78596_101_322.pdf 

Vì có ngoặc xung quanh toàn bộ mô hình, toàn bộ tên file sẽ được chụp.

Lưu ý rằng mô hình không làm việc với grep trong chế độ truyền thống:

$ cat test2.txt | grep '((?:\d+_){3}(?:\d+)\.pdf$)' 
... no return 

Nhưng CO làm việc nếu bạn sử dụng mở rộng chuyển đổi mô hình (giống như gọi egrep):

$ cat test2.txt | grep -E '((?:\d+_){3}(?:\d+)\.pdf$)' 
- 142_78596_101_322.pdf 
Các vấn đề liên quan