Danh sách thư mục nên hoạt động; ví dụ: đây là những gì tôi đã sử dụng trong một tập lệnh (giả sử gnu diff),
diff -r \
--exclude="*~" \
--exclude=".svn" \
--exclude=".git" \
--exclude="*.zip*" \
--exclude="*.gz" \
--exclude="*.tar" \
...etc
... Bỏ qua nội dung .svn
và thư mục .git
, nhưng cũng có các tệp riêng lẻ có tên *.zip
/ *.gz
/ etc.
Chỉnh sửa: Để lọc các đường dẫn của biểu mẫu dir_a/file1
nhưng diff
các tệp vẫn có cùng tên cơ sở, chẳng hạn như dir_b/file1
hoặc dir_a/b/file1
, sau đó, một danh sách các tệp diff
sẽ phải được tạo (ví dụ: bằng cách sử dụng find
) và tệp để so sánh xuất phát từ các đường dẫn này; ví dụ, được đưa ra
$ find ONE TWO -type f -print
ONE/a/1.txt
ONE/a/2.txt
ONE/a/b/2.txt
TWO/a/1.txt
TWO/a/2.txt
TWO/a/b/2.txt
bạn tạo danh sách các tệp để so sánh, ví dụ như loại trừ */a/2.txt
nhưng vẫn so sánh các tệp khác có tên 2.txt
. Chỉ cần "tìm" tất cả các tệp ngoại trừ ONE/a/2.txt
(một biểu thức chính quy cũng có thể được sử dụng ở đây, chẳng hạn như .*/a/2.txt
)
$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
-exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;
có hiệu lực bỏ qua ONE/a/2.txt
(và TWO/a/2.txt
), nhưng vẫn so sánh các tệp khác có tên 2.txt
:
diff -q ONE/a/1.txt TWO/a/1.txt
diff -q ONE/a/b/2.txt TWO/a/b/2.txt
Chỉnh sửa: Hoặc, vui hơn với find
(thêm niềm vui còn lại dưới dạng bài tập cho người đọc), chọn các tệp hoặc thư mục để loại trừ và sau đó diff
mọi thứ khác:
$ find ONE \( -regex 'ONE/a/2.txt' -o -name b -prune \) \
-o -type f -exec bash -c 'echo diff -q "${1}" "${2/ONE/TWO}"' - {} {} \
Ví dụ trên không bao gồm tệp cụ thể "{top} /a/2.txt", bất kỳ thư mục nào có tên "b" và mọi thứ khác đều khác. (Thay vì đơn giản " -name b
" bạn cũng có thể sử dụng " -regex '.*/b'
" - lưu ý, không có dấu "/".)
diff
's--exclude
lựa chọn là quá shitty ...