2010-04-20 40 views
8

Tôi có hai cây mã nguồn gần như tương tự, nhưng không có quyền truy cập vào kho lưu trữ mã nguồn vì vậy tôi đang mắc kẹt với các gói phát hành mà còn chứa kiểm tra các báo cáo, tài liệu, tập tin nhị phân, vvLàm cách nào để phân biệt các tệp nguồn?

lệnh diff chỉ hỗ trợ --exclude, nhưng tôi muốn làm một cái gì đó như diff -wbur --include='*.c,*.h' tree1 tree2

Tôi biết rằng this question có phần liên quan, nhưng không thực sự giải quyết được vấn đề của tôi.

điểm thưởng cho bỏ qua khối thay đổi đó là hoàn toàn trong C comments :)

Trả lời

14

ít sửa đổi để Kết quả là từ google giúp, trong tree1 đã find . -name '*.[ch]' -exec diff -wibu {} ../tree2/{} \;

+1

Đối với C cây nguồn ++, hãy thử '-name '* .h "-o -name" * .cpp "' trong lệnh trên. – mgold

4

Dưới đây là một chút kịch bản sản xuất vá:

#!/bin/bash 

USAGE="USAGE: $0 <dist dir> <edited dir>" 

[ '--help' == "$1" ] && { echo $USAGE; exit 0; } 
[ 2 -eq $# ] || { echo $USAGE; exit 1; } 

# trim starting './' and trailing /'/ 
original=$(echo $1 | sed 's-^\./--;s-/$--') 
changed=$(echo $2 | sed 's-^\./--;s-/$--') 

[ -d $original ] || { echo "ERROR: Directory $original does not exist" >&2 ; exit 2; } 
[ -d $changed ] || { echo "ERROR: Directory $changed does not exist" >&2; exit 3; } 

#command="ls -l" 
command="diff -Naur" 

find $original -name '*.[ch]' -o -name '*.cpp' | sed 's-^[^/]*/--' | { while read file; do $command $original/$file $changed/$file; done; } 
2

Tôi sẽ loại trừ mọi thứ không khớp với .c hoặc .h. Vì vậy, nó có nghĩa là nó sẽ chỉ bao gồm .c và .h file:

diff -x "*.[^ch]" 

Đối với tôi nó là cách tốt nhất để làm bởi vì bạn chỉ sử dụng diff

+0

Điều này không hoạt động chính xác: nó bao gồm các phần mở rộng như .cpp, .hxx, .cache và .help. – cmaster

0

tôi đề xuất một giải pháp dễ dàng hơn tìm đến bảo trì diff , đây là thread: http://lists.gnu.org/archive/html/bug-diffutils/2014-10/msg00000.html

ý tưởng là cung cấp một tùy chọn mới mà chỉ thị khác để phân tích trên các tập tin phù hợp với một regex, như: diff -Nurp --only "*.[hc]" source/ source-new/

Dưới đây là hướng dẫn để vá diffutils

Clone repo git clone git://git.savannah.gnu.org/diffutils.git

chạy bootstrap.sh bên diffutils thư mục và giải quyết các phụ thuộc cho đến khi nó tạo ra kịch bản ./cofigure

Download bản vá từ liên kết ở trên

Áp dụng nó git apply <PATCHFILE>

Định cấu hình và biên dịch ./configure make

Điều này sẽ tạo ra các diff vá trong src/diff

Cheers

+0

Tôi đã thêm bản vá giải quyết vấn đề của tôi. ow có vẻ là một câu trả lời tốt cho tôi :) – geckos

2

Bạn có thể viết tất cả các file để loại trừ vào một tập tin tạm thời và đưa nó cho -X lập luận khác của.

find tree1 tree2 -type f -not -name '*.[ch]' >exludes 
diff -wbur tree1 tree2 -X excludes 

Hoặc đơn giản hơn (chỉ hoạt động trong Bash):

diff -wbur tree1 tree2 -X <(find tree1 tree2 -type f -not -name '*.[ch]') 

Bạn có thể sử dụng nhiều đối số tên nếu bạn có phần mở rộng tên tập tin dài hơn:

diff -wbur tree1 tree2 \ 
    -X <(find tree1 tree2 -type f -not -name '*.java' -and -not -name '*.sql') 
Các vấn đề liên quan