2012-12-08 32 views
9

Tôi muốn tìm tất cả các tệp kết thúc bằng .c, .R hoặc .Rd. Tôi đã thửTìm Unix: Cách so khớp các tệp * .R và * Rd?

find . -iname "*.[cR]" -print 

cung cấp tất cả các tệp kết thúc bằng .c hoặc .R. Làm cách nào để tôi có thể nhận thêm các tệp .Rd? Tôi biết rằng [] chỉ phù hợp với một nhân vật, nhưng tôi không thể điều chỉnh nó để cung cấp .Rd file cũng như (cố gắng làm việc với | hoặc tùy chọn -regex vv)

Trả lời

15

Ở đây bạn đi =)

find -name "*.c" -o -name "*.R" -o -name "*.Rd" 

Nếu đó chỉ là 3 loại tiện ích mà bạn đang tìm kiếm, tôi khuyên bạn nên tránh xa regex và chỉ sử dụng toán tử -o (như trong "hoặc") để soạn tìm kiếm của bạn thay thế.

+0

Giải pháp này dường như phụ thuộc vào nền tảng: Tôi đã cài đặt trình giả lập Cygwin UNIX trên máy tính Windows của mình và lệnh tìm kiếm sau đây có vẻ hoạt động: 'find ./ -name" * .exe "' và 'find ./ -name "* .dll" 'nhưng' tìm ./ -name "* .exe" -o name "* .dll" 'có vẻ không hoạt động. – Dominique

7

Một sử dụng thích hợp của -regex sẽ là:

find -regex '.*\.\(R\|Rd\|c\)' 

Nếu bạn muốn sử dụng biểu thức thông thường bạn cần phải ghi nhớ rằng những áp dụng cho toàn bộ con đường, không chỉ đối với filename:

-regex pattern 
      File name matches regular expression pattern. This is a match 
      on the whole path, not a search. For example, to match a file 
      named `./fubar3', you can use the regular expression `.*bar.' or 
      `.*b.*3', but not `f.*r3'. The regular expressions understood 
      by find are by default Emacs Regular Expressions, but this can 
      be changed with the -regextype option. 

Tôi đồng ý với câu trả lời của sampson-chen, rằng các regex có lẽ không phải là lựa chọn tốt nhất ở đây.

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