2012-03-23 21 views
8

Tôi đang sử dụng lệnh regex sau đây trong thiết bị đầu cuối OS X để tìm toàn bộ tải tệp có tên tệp 8 chữ số theo sau là .jpg, .gif, .png hoặc .eps. Sau đây sản xuất không có kết quả mặc dù tôi đã nói với OS X/BSD tìm để sử dụng regex hiện đạiOS X Tìm trong bash có chữ số regex d không tạo ra kết quả mong đợi

find -E ./ -iregex '\d{8}' 

Sử dụng http://rubular.com/ (http://rubular.com/r/YMz3J8Qlgh) cho thấy mô hình regex sản xuất dự kiến kết quả và OS X tạo kết quả khi nhập

find . -iname '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].*' 

Nhưng điều này có vẻ hơi dài.

+1

Trang web cho biết trang này sử dụng POSIX; có lẽ bạn cần '[: digit:]' thay vì '\ d'? – Wiseguy

+0

@Wiseguy \ d không được hỗ trợ trong BRE (POSIX cơ bản lại) cũng không phải ERE (POSIX mở rộng lại). Các regex mặc định cho GNU tìm thấy trong emacs, mà là tương tự như BRE. BRE không hỗ trợ khoảng thời gian ({8}). – jordanm

+0

@jordanm Phải, đó là lý do tại sao tôi đề nghị sử dụng một lớp nhân vật POSIX. (Trong cờ '-E', OS X [' trang 'tìm người dùng] (https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/find.1.html) đã giới thiệu tôi đến trang ['re_format'] (https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man7/re_format.7.html#//apple_ref/doc/ man/7/re_format) cho cú pháp được hỗ trợ.) – Wiseguy

Trả lời

10

Những lệnh này hoạt động trên OSX

find -E . -iregex '.*/[0-9]{8}\.(jpg|png|eps|gif)' 

lệnh này phù hợp 12345678.jpg, không 123456789.jpg


find -E . -iregex '.*/[0-9]{8,}\.(jpg|png|eps|gif)' 

lệnh này các trận đấu 12345678.jpg và 123456789.jpg


.*/ 

bằng các đường dẫn thư mục hoặc đường dẫn thư mục con

+0

Cờ -E nghĩa là gì? –

+0

Trang OS X dành cho người tìm kiếm cho biết -E là 'các mẫu biểu thức chính quy mở rộng (hiện đại) thay vì các biểu thức chính quy cơ bản (BRE)' –

1

man re_format giải thích chi tiết cụ thể của quy trình hiện đại mà find sẽ chấp nhận.

này làm việc cho tôi: -iregex '[0-9]{8}'

+0

GNU tìm sử dụng BRE theo mặc định, không cho phép khoảng thời gian ({8}). ERE có thể được sử dụng bằng cách chỉ định -regextype. Không có ý tưởng những gì OSX tìm thấy hỗ trợ. – jordanm

+0

Nó hoạt động tốt bằng cách sử dụng cờ -E như OP đề xuất. Tôi chỉ đơn thuần là bình luận về chính mẫu regex. – jdi

+0

Hmmm tôi vẫn không nhận được kết quả mong đợi Vì vậy, tôi đã cố gắng mã này 'find -E ./ -iregex '[0-9] {8}. *'' Mở danh sách các file '102498223.jpg 103.326.202 (1) .jpg 103326202.jpg 103.724.407 (1) .jpg 103724407.jpg 104307929.jpg 104823717.jpg 105473655.jpg 105473655_extracted.psd 105473660.jpg 106957651.jpg 108.037.226. jpg 108210958.jpg 108350120.jpg 110119642.jpg 111063966.jpg 111651198.jpg 112145402.jpg 112229007.jpg 113615728.jpg' Và tôi nhận được 0 kết quả trả về. Đôi khi vẫn không có ở đây. – juliushibert

2

Với tất cả những câu trả lời của bạn, tôi cuối cùng đã có thể sử dụng OSX find (10.8.1) với regex. Để trả lại, đây là kết quả của tôi: Chúng tôi sử dụng chuỗi tùy chỉnh để xác định clip, mẫu sẽ như sau: "YYMMDDabC## abc * .ext": Year/Month/Day/3chars/2digits/3chars/whatever/ext

find -E /path/to/folder -type f -regex '^/.*/[0-9]{6}[A-Za-z]{3}[0-9]{2}[A-Za-z0-9]{3}\.*.*\.(ext)$' 

^ban đầu đảm bảo mẫu ở đầu tìm kiếm, [0-9] {6} tìm kiếm chuỗi gồm 6 chữ số, \ d không hoạt động. \ D không hoạt động đối với các chữ cái, A-Za-z thực hiện. $ Cuối cùng đảm bảo tìm kiếm cuối cùng là kết thúc của chuỗi.

Sau khi đọc manles của Apple về findre_format tôi đã hoàn toàn không theo dõi về các ký tự thoát.

0

Đây là chủ đề mở mắt. Tôi đang đưa vào bảng một giải pháp cho vấn đề của riêng tôi và hy vọng làm rõ một hoặc hai điều cho bạn và những người dùng khác đang tìm kiếm sự vững mạnh (như tôi).

Trong trường hợp của tôi, mac của tôi có nhiều ảnh trùng lặp. Khi máy Mac tạo bản sao, chúng sẽ nối thêm một dấu cách và một số cho đến cuối phần mở rộng.

IMG_0001.JPG có thể có phức tạp đa dạng với IMG_0001 2.JPG, IMG_0001 3.JPG v.v. Trong trường hợp của tôi, điều này đã đi vào và tạo nên khoảng 2.600 tập tin vô ích.

Để mọi thứ được bơm lên, tôi đã điều hướng đến thư mục được đề cập.

cd ~/Pictures/ 

Tiếp theo, hãy tự mình chứng minh rằng chúng tôi có thể liệt kê tất cả các tệp trong thư mục. Bạn sẽ nhận thấy rằng trong regex nó cần thiết để bao gồm các . mà nói "nhìn vào thư mục này". Ngoài ra, bạn phải khớp với toàn bộ tên tệp để .+ là cần thiết để bắt tất cả các ký tự khác.

find -E . -regex '\..+' 

cách thích hợp, kết quả sẽ mang lại dây mà bạn sẽ phải phù hợp bao gồm . tôi đã đề cập trước đó, các dấu gạch chéo /, và mọi thứ khác.

./IMG_1788.JPG 
./IMG_1789.JPG 
./IMG_1790.JPG 
./IMG_1791.JPG 

Vì vậy, tôi không có thể viết này để tìm bản sao vì nó không bao gồm các "./"

find -E . -regex 'IMG_[0-9]{4} .+' 

nhưng tôi thể viết này để tìm bản sao bởi vì nó bao gồm "./"

find -E . -regex '\./IMG_[0-9]{4} .+` 

hoặc phiên bản ưa thích hơn với .*/ như đã đề cập bởi @ jackjr300 làm điều tương tự.

find -E . -regex '.*/IMG_[0-9]{4} .+` 

Cuối cùng là phần khó hiểu. \d không được nhận dạng trong BSD. [0-9] cũng hoạt động tốt. Câu trả lời của người dùng khác trích dẫn hướng dẫn sử dụng re_format trong đó liệt kê cách viết các mẫu phổ biến thay thế những thứ như \d bằng cú pháp hình vuông-hài hước trông giống như sau: [:digit:]. Tôi đã thử và thử, nhưng nó không bao giờ hoạt động. Chỉ cần sử dụng [0-9]. Trong trường hợp của tôi, tôi lãng phí một loạt thời gian nghĩ rằng tôi nên đã sử dụng [:space:] thay vì một không gian, nhưng tôi tìm thấy (như thường lệ!) Mà tôi chỉ cần thở và thực sự đọc regex. Hóa ra đó là sai lầm của tôi. :)

Hy vọng điều này sẽ giúp ai đó!

0

Tôi đang sử dụng regex này để tìm và xóa iPhone dups:

find -E. -regex '. */IMG_ [0-9] {4} [] 1.JPG' -print -exec rm '{}' \;

Các vấn đề liên quan