Làm thế nào để khác nhiều tập tin trên các thư mục?


19

Tôi đang cố gắng tìm diffs giữa tất cả các tệp có cùng tên trên hai bản sao của một thư mục (giả sử là bản sao lưu và bản sao lưu). Ví dụ: tôi có thể diffhai tệp cùng tên trong cả hai:

> diff d1/f.cpp d2/f.cpp

hoặc tôi có thể tìm thấy sự khác biệt trên các thư mục:

> diff d1 d2

nhưng làm thế nào tôi có thể tìm thấy sự khác biệt giữa các *.cpptập tin?

> diff d1/*.cpp d2/*.cpp

dường như không hoạt động (vì lý do rõ ràng).

[Có thể dễ dàng giải quyết bằng các vòng lặp, nhưng tôi đang cố gắng tìm một cách thanh lịch hơn]

Câu trả lời:


13

Bạn có thể sử dụng một vòng lặp shell chạy diff cho mỗi tệp, mặc dù điều này sẽ không bắt được các trường hợp trong đó d2 chứa một tệp, nhưng d1 thì không. Nó có thể là đủ mặc dù.

for file in d1/*.cpp; do
    diff "$file" "d2/${file##*/}"
done

Hoặc tất cả trên một dòng:

for file in d1/*.cpp; do diff "$file" "d2/${file##*/}"; done

Phần ${file##*/}này là một mở rộng tham số đặc biệt.

Nếu biến tệp chứa d1/hello.cpp, sau đó "${file##*/}"sẽ mở rộng thành hello.cpp(giá trị của tệp, nhưng với mọi thứ lên đến và bao gồm, cuối cùng / bị xóa).

Vì vậy, "d2/${file##*/}"sẽ dẫn đến d2/hello.cppvà lệnh diff kết quả là như vậydiff d1/hello.cpp d2/hello.cpp

Xem http://mywiki.wooledge.org/BashFAQ/100 để biết thêm về các thao tác chuỗi trong bash.

Mặt khác, một hệ thống kiểm soát phiên bản (như lật đổ, git, đồng bóng v.v ...) sẽ làm cho loại khác biệt này dễ dàng hơn nhiều.


Tôi nghĩ rằng trong hai câu trả lời tuyệt vời, câu trả lời này rõ ràng hơn khi có nhiều loại tệp (mặc dù tôi đã đề cập trong câu hỏi rằng tôi đang tìm giải pháp không có vòng lặp), vì vậy tôi đã chấp nhận nó. Một bổ sung được thêm vào echo "${file##*/}";trước difflệnh, vì vậy người ta biết những tập tin nào thực sự được so sánh. Ngoài ra, như đã đề cập trong câu trả lời của @ Rinzwind, phương pháp này không bao gồm trường hợp là danh sách tệp không hoàn toàn giống nhau trong cả hai thư mục.
ysap

52

diff -qr {DIR1} {DIR2} không tất cả các tập tin trong cả hai thư mục.

  • q chỉ cho thấy sự khác biệt
  • rkhông đệ quy. Bỏ nó ra nếu bạn không cần điều đó

Bạn không thể nói difftrực tiếp để sử dụng ký tự đại diện nhưng bạn có thể thêm:

-x PAT  --exclude=PAT
    Exclude files that match PAT.

-X FILE    --exclude-from=FILE
   Exclude files that match any pattern in FILE.

để loại trừ các tập tin. Vì vậy, nếu bạn chỉ muốn *.cppphương pháp đơn giản nhất là tạo một tệp văn bản liệt kê tất cả các tệp không có *.cpp. Bạn có thể làm điều này với lệnh sau: ls -I "*.cpp" > excluded_filestrong đó -I "*.cpp"đối số bỏ qua tất cả các tệp .cpp. Lưu ý rằng các dấu ngoặc kép là cần thiết.


Đơn giản, và hoạt động hoàn hảo.
Jose Gómez

4

Một thời gian sau khi đặt câu hỏi, tôi phát hiện ra meldtiện ích diff và đang sử dụng nó kể từ đó. Đây là một phần tuyệt vời của chương trình dựa trên GUI giúp cho việc so sánh và hợp nhất giữa các tệp và thư mục trở thành một nhiệm vụ rất dễ dàng. Nó không so sánh hai hoặc ba chiều.

Cụ thể, nó trả lời câu hỏi ban đầu của tôi ở chỗ nó hiển thị cho bạn một so sánh được mã hóa màu của nội dung thư mục và cho phép bạn so sánh các tệp cụ thể bằng cách nhấp đúp vào tên tệp.

Nếu một người cần nhiều hơn một so sánh ba chiều, thì gvimdiff(dựa trên vimtrình chỉnh sửa) cũng là một công cụ tuyệt vời cung cấp chức năng này.


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.