2012-04-12 32 views
18

Làm thế nào bạn có thể thực hiện một diff đệ quy của các tập tin trong hai thư mục (a, b):Chỉ bao gồm các file phù hợp với một mô hình được đưa ra trong một diff đệ quy

$ diff -r a b 

nhưng chỉ nhìn vào file có tên phù hợp với một mô hình đã cho. Ví dụ, bằng cách sử dụng cú pháp tương tự có sẵn trong các lệnh tìm kiếm, điều này sẽ trông giống như:

$ diff -r a b -name "*crazy*" 

đó sẽ hiển thị diffs giữa các file có cùng tên và đường dẫn vào a và b, trong đó có "điên" trong tên của họ .

Có hiệu quả, tôi đang tìm đối diện với tùy chọn --exclude có sẵn trong khác biệt.

+0

Tôi đồng ý rằng điều này sẽ hữu ích. 'grep' có cờ '--include' – xdhmoore

Trả lời

11

Có lẽ đây là một chút gián tiếp, nhưng nó phải hoạt động. Bạn có thể sử dụng find để có được một danh sách các file không trận đấu mô hình, và sau đó "loại trừ" tất cả những tập tin:

find a b -type f ! -name 'crazy' -printf '%f\n' | diff -r a b -X - 

Các -X - sẽ làm cho diff đọc mẫu từ stdin và loại trừ bất cứ điều gì kết quả phù hợp. Điều này sẽ hoạt động nếu tệp của bạn không có các ký tự vui như * hoặc ? trong tên của chúng. Nhược điểm duy nhất là sự khác biệt của bạn sẽ không bao gồm lệnh find, do đó, lệnh diff được liệt kê không hữu ích.

(Tôi chỉ thử nghiệm nó với GNU finddiff).

EDIT:

Vì chỉ có phi GNU find không có -printf, sed có thể được sử dụng như một sự thay thế:

find a b -type f ! -name '*crazy*' -print | sed -e 's|.*/||' | diff -X - -r a b 

Đó cũng giả định rằng phi GNU diff-X mà Tôi không biết.

+0

Thật không may, điều này phải làm việc trên Mac OS X và tôi thấy từ http://stackoverflow.com/questions/752818/why-does-macs-find-not-have -e-option-printf rằng tìm kiếm của BSD không có tùy chọn -printf. Vì vậy, dường như không có cách nào tốt đẹp để tạo một lệnh BSD và GNU tương thích. –

+1

@ EdwardD'Souza được cập nhật để không sử dụng '-printf' – FatalError

+0

@ EdwardD'Souza Hãy xem xét [MacPorts] (http://www.macports.org/) nếu bạn muốn tải các công cụ GNU trên OSX. –

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