2011-07-15 49 views
50

Làm việc trên một hộp Constantora Fedora. Tôi đang tìm kiếm diff hai thư mục đệ quy để kiểm tra các thay đổi nguồn. Do thiết lập của dự án (trước khi tham gia dự án của tôi với dự án đã nói! tiếng thở dài), các thư mục chứa cả nguồn và nhị phân, cũng như các tập dữ liệu nhị phân lớn. Trong khi diffing cuối cùng hoạt động trên các thư mục này, nó sẽ mất khoảng 20 giây nếu tôi có thể bỏ qua các tệp nhị phân.Diff Một thư mục đệ quy, bỏ qua tất cả các tập tin nhị phân:

Theo như tôi hiểu, diff không có chế độ 'bỏ qua tệp nhị phân', nhưng có đối số bỏ qua sẽ bỏ qua cụm từ thông dụng trong một tệp. Tôi không biết phải viết gì ở đó để bỏ qua các tệp nhị phân, bất kể phần mở rộng.

Tôi đang sử dụng lệnh sau nhưng không bỏ qua các tệp nhị phân. Có ai biết làm thế nào để sửa đổi lệnh này để làm điều này?

diff -rq dir1 dir2

+2

Hãy thử sử dụng 'cmp' thay vì' diff', sẽ không bỏ qua tập tin nhị phân, nhưng phải nhanh hơn –

+0

Cảm ơn mẹo. –

+1

eek. đây là biện minh cho trẻ em áp phích để kiểm soát nguồn. nếu bạn không sử dụng nó, bạn nên thế. nếu quyết định không nằm trong tay bạn, bạn nên tranh luận nhiệt tình. vấn đề của bạn sẽ biến mất với một thiết lập git thích hợp ... – fearlesstost

Trả lời

31

Có thể sử dụng grep -I (tương đương với grep --binary-files=without-match) làm bộ lọc để sắp xếp các tệp nhị phân.

dir1='folder-1' 
dir2='folder-2' 
IFS=$'\n' 
for file in $(grep -Ilsr -m 1 '.' "$dir1"); do 
    diff -q "$file" "${file/${dir1}/${dir2}}" 
done 
+0

Điều này trông cực kỳ hứa hẹn. Tôi sẽ kiểm tra điều này và cho bạn biết làm thế nào nó đi/chấp nhận như một câu trả lời nếu nó hoạt động! –

+0

Điều này làm việc nhanh hơn rất nhiều cho tôi. Cảm ơn bạn. –

+2

Bất cứ ai cũng biết mục đích của 'IFS = $ '\ n''? – Zubin

0

Vâng, như một loại kiểm tra thô, bạn có thể bỏ qua các tệp phù hợp/\ 0 /.

+1

Vấn đề là, nó không giống như diff thậm chí hỗ trợ bỏ qua các tập tin ở tất cả. –

+1

Cờ '-x' có thể được sử dụng để bỏ qua các tệp. – xdhmoore

0

Sử dụng kết hợp find và lệnh file. Điều này đòi hỏi bạn phải thực hiện một số nghiên cứu về đầu ra của lệnh file trong thư mục của bạn; bên dưới tôi giả định rằng các tệp bạn muốn phân biệt được báo cáo là ascii. HOẶC, sử dụng grep -v để lọc ra các tệp nhị phân.

#!/bin/bash 

dir1=/path/to/first/folder 
dir2=/path/to/second/folder 

cd $dir1 
files=$(find . -type f -print | xargs file | grep ASCII | cut -d: -f1) 

for i in $files; 
do 
    echo diffing $i ---- $dir2/$i 
    diff -q $i $dir2/$i 
done 

Vì bạn có thể biết tên của các tập tin nhị phân rất lớn, đặt chúng trong một hash-mảng và chỉ làm diff khi một tập tin không có trong băm, một cái gì đó như thế này:

#!/bin/bash 

dir1=/path/to/first/directory 
dir2=/path/to/second/directory 

content_dir1=$(mktemp) 
content_dir2=$(mktemp) 

$(cd $dir1 && find . -type f -print > $content_dir1) 
$(cd $dir2 && find . -type f -print > $content_dir2) 

echo Files that only exist in one of the paths 
echo ----------------------------------------- 
diff $content_dir1 $content_dir2  

#Files 2 Ignore 
declare -A F2I 
F2I=([sqlite3]=1 [binfile2]=1) 

while read f; 
do 
    b=$(basename $f) 
    if ! [[ ${F2I[$b]} ]]; then 
     diff $dir1/$f $dir2/$f 
    fi 
done < $content_dir1 
50

loại gian lận nhưng đây là những gì tôi đã sử dụng:

diff -r dir1/ dir2/ | sed '/Binary\ files\ /d' >outputfile 

này đệ quy so sánh dir1 dir2 đến, sed loại bỏ các dòng cho các tập tin nhị phân (bắt đầu với "tập tin nhị phân"), sau đó nó được chuyển đến outputfile.

+4

+1 để gian lận;) – Nippey

+0

cảm ơn bạn! làm cách nào để loại trừ tất cả các tệp xml? – Serg

+5

@Serg Bạn có thể loại trừ các tệp bằng cờ '-x'. Hãy thử 'diff -r -x '* .xml' dir1 dir2' Ngoài ra,' man diff' để biết thêm thông tin. – xdhmoore

10

Tôi đã đến câu hỏi (cũ) này đang tìm kiếm một cái gì đó tương tự (Config tệp trên máy chủ sản xuất kế thừa so với cài đặt apache mặc định). Theo gợi ý của @ fearlesstost trong các ý kiến, git đủ nhẹ và nhanh chóng có thể đơn giản hơn bất kỳ gợi ý nào ở trên. Sao chép version1 vào một thư mục mới. Sau đó, thực hiện:

git init 
git add . 
git commit -m 'Version 1' 

Xóa tất cả các tệp khỏi phiên bản 1 trong thư mục này và sao chép phiên bản 2 vào thư mục. Bây giờ làm:

git add . 
git commit -m 'Version 2' 
git show 

Điều này sẽ cho bạn thấy phiên bản Git của tất cả sự khác biệt giữa lần commit thứ nhất và thứ hai. Đối với các tập tin nhị phân nó sẽ chỉ nói rằng chúng khác nhau. Ngoài ra, bạn có thể tạo một nhánh cho mỗi phiên bản và cố gắng hợp nhất chúng bằng cách sử dụng các công cụ hợp nhất của git.

+2

Hoặc chỉ 'git diff folder1 folder2' ... –

0

Nếu tên của các tệp nhị phân trong dự án của bạn tuân theo một mẫu cụ thể (* .o, * .so, ...), như thường lệ, bạn có thể đặt các mẫu đó vào một tệp và chỉ định nó bằng cách sử dụng -X (dấu gạch ngang X).

nội dung của "loại trừ tập tin" của tôi * .o * .so * .git

diff -X exclude_file -r . other_tree > my_diff_file 
+0

Đó là -x NOT -X. –

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