Làm cách nào tôi có thể làm cho 'diff -X' bỏ qua các đường dẫn cụ thể và không phải tên tệp?


28

Đang làm: diff -r -X <ignore-list> <src-dir> <dest-dir>

dường như không diffbỏ qua các mục trong <ignore-list>nếu chúng có dạng <dir>/<file>.

Các mục của mẫu <file> làm tuy nhiên được xem xét. Đây là một vấn đề vì tôi có thể có nhiều tệp có tên <file>trong các thư mục con khác nhau, một số trong đó tôi không muốn bỏ qua.

Dường như không có nhiều thông tin liên quan đến cú pháp mẫu trong trang này diff. Từ những gì tôi có thể nói, đó chỉ là tên cơ sở của một tệp được xem xét bởi diff (xem http://forums.gentoo.org/viewtopic-t-889788-start-0.html nếu bạn quan tâm).


người đàn ông, diff's --excludelựa chọn là quá shitty ...
Elouan Keryell-Thậm chí

Câu trả lời:


30

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 .svnvà 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/file1nhưng diffcác tệp vẫn có cùng tên cơ sở, chẳng hạn như dir_b/file1hoặc dir_a/b/file1, sau đó, một danh sách các tệp diffsẽ 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.txtnhư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 đó diffmọ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 "/".)


2
Cảm ơn nhưng tôi nghĩ bạn đang thiếu điểm. Hỗ trợ duy nhất dường như là khi bạn sử dụng 'tên cơ sở'. Đó có thể là tên của một thư mục hoặc một tập tin. Trong cả hai trường hợp, diff bỏ qua những gì bạn đã yêu cầu. Vấn đề phát sinh khi bạn sử dụng đường dẫn. Ví dụ: tôi không thể lấy diff để bỏ qua / an / perfect / path / to / a / file hoặc ./a/relative/path/to/a/file.
Tro

2
diff --exclude = "/ this / cụ thể / tập tin / đó / im / rõ ràng / khẩn khoản / bạn / để / bỏ qua". Nó sẽ không hoạt động.
Tro

3
chính xác, excludecác mẫu được khớp với tên cơ sở của tệp (theo gnu.org/software/diffutils/manual/html_node/ cảm ); đường dẫn sẽ không hoạt động (như trong foo/bar.txt). Để làm điều đó, bạn có thể sẽ phải chạy findđể tạo danh sách tên tệp và lấy đường dẫn đến tệp để so sánh.
michael

cập nhật câu trả lời để bao gồm ví dụ loại trừ đường dẫn tệp từ diff, thay vì chỉ sử dụngbasename
michael

Được rồi, tôi thấy những gì bạn đang đề xuất nhưng dường như có một vấn đề. Tôi cũng cần xem xét các thư mục, không chỉ các tệp (ví dụ -type f). Bây giờ, trong khi bạn vẫn có thể cắt xén một số tệp nhất định bằng regapi find, nếu đầu vào diffchứa thư mục, nó sẽ đi qua và so sánh các tệp trong thư mục đó và một số tệp này có thể cần phải bỏ qua .... vì vậy bạn trở lại quảng trường 1.
Tro


1

Để loại trừ thư mục directory/sub-directory, tôi sử dụng

diff -r <src-dir> <dest-dir> | grep -v directory/sub-directory

Tuy nhiên, mặc dù nó nên hoạt động cho một loại trừ duy nhất, nhưng nó không thể có trong danh sách bỏ qua dài như bạn có.


-2
$ diff -rq foo.orig foo | grep -vP 'ignore1/|exclude2/' | awk '{print $2}' | cut -d'/' -f2- | xargs -I{} diff -u foo.orig/{} foo/{}

1
Trong khi điều này có thể trả lời câu hỏi, nó sẽ là một câu trả lời tốt hơn nếu bạn có thể cung cấp một số lời giải thích tại sao nó làm như vậy.
DavidPostill
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.