2011-09-21 41 views
6

Có rất nhiều giải pháp để tạo bản vá cấp tệp cho các tệp văn bản và các loại tương tự. Những gì tôi đang tìm kiếm là một lệnh script/shell dễ dàng so sánh oldversion/newversion/và cung cấp cho tôi một cây các tệp mà tôi cần sao chép trên oldversion để làm cho nó bằng newversion (các tệp giả định không bị xóa trong bản cập nhật phiên bản). Lưu ý rằng hai thư mục chứa cả tệp nhị phân và tệp văn bản.Khác biệt giữa hai cây thư mục để tạo bản vá mức tệp/thư mục (bao gồm tệp nhị phân)

Trước đây, chúng tôi đã sử dụng hack:

fdupes -qrf newversion/ oldversion/ | grep "newversion" | xargs rm;

Rời chúng tôi với các thư mục "newversion" mà có thể được đóng gói như là một bản vá.

Thật không may, điều này hóa ra là tai hại vì fdupes không xem xét tên tệp.

Điều gì tuyệt vời là một cái gì đó giống như fdupes thực sự đã bao gồm tên tệp trong so sánh.

+0

Bạn chỉ đang tìm kiếm danh sách tệp "mới" chứ không phải tệp "đã sửa đổi" trong phiên bản mới /? –

+0

Cả tệp mới và tệp đã sửa đổi. –

Trả lời

5

Lệnh khác có thể được yêu cầu xuất các tên tệp khác nhau.

diff --quiet --recurse --unidirectional-new-file OLDDIR NEWDIR 

Files old/main and new/main differ 
Files old/main.cpp and new/main.cpp differ 
Files old/Makefile and new/Makefile differ 
Files old/sounds/popalien.wav and new/sounds/popalien.wav differ 
Files old/sounds/saucer.wav and new/sounds/saucer.wav differ 

Tất nhiên, nó không phải là một kết quả tốt đẹp, nhưng vì bạn chỉ tìm kiếm các file MỚI đóng gói như một miếng vá, một ống sed nhanh chóng công trình kỳ diệu:

diff --quiet --recurse -unidirectional-new-file OLDDIR NEWDIR | \ 
    sed "s/^.* and \(.*\) differ/\1/" 

(chia cho dễ đọc)

new/main 
new/main.cpp 
new/Makefile 
new/sounds/popalien.wav 
new/sounds/saucer.wav 

Spaces xung quanh 'và' và preceeding 'khác biệt'

thứ tự của các toán hạng để diff tạo ra sự khác biệt, đối số đầu tiên là trái của 'và', thứ hai là sau. Xem ra cho điều đó.

Ngoài ra, nếu bạn xóa tệp khỏi NEWDIR, điều này sẽ không tìm thấy tệp như đã cho, chỉ các tệp được thêm hoặc thay đổi. Ngoài ra còn có tên tệp đầu ra cho các tệp không tìm thấy trong một trong hai thư mục con, thay thế tệp --unidirection-new-với -new-file. (tùy chọn ngắn tồn tại cho tất cả ngoại trừ - vô hướng ..)

1

diff -ruN oldversion newversion

0

Tôi biết đã lâu rồi. Tôi cần giải pháp tương tự. Tôi tìm thấy bài đăng này nhưng nó không đủ. Sau đó, tôi tìm thấy rsync có thể thực hiện công việc IFF bạn `` vá`` các bản sao giống hệt nhau và không cần phải hợp nhất với các thay đổi khác. Tôi có ý định sử dụng điều này với việc cập nhật các gương yum trên các máy bị ngắt kết nối. giải pháp đầy đủ của tôi là tham gia nhiều hơn một chút, và tôi viết lệnh từ bộ nhớ vì vậy một số chi tiết tốt có thể sai, nhưng cốt lõi:

# create identical copy "copy.0" 
rsync -a master/ copy.0/ 

# Presumably transfer copy.0/ to another machine for offline use 
# but copy.0 must not mutate outside of this process or sync probably 
# will not work. 

# some time later update master, e.g. rsync master from upstream mirror 
# mutates master in some way, changes/adds/removes remove files including 
# binaries 
echo -n $'\001\002' > master/new.bin 
rm master/gone.bin 

# generate rsync batch that can be used to ``patch`` copy.0 
# to become identical to master 
rsync -a --delete --itemize-changes --only-write-batch=copy.0.batch \ 
    master/ copy.0/ 
# now the file copy.0.batch contains only the deltas to be applied 

# transfer the batch file to where it needs to be applied 

# apply the batch to copy.0 
rsync -a --delete --itemize-changes --read-batch=copy.0.batch copy.0/ 

này sẽ chăm sóc của xóa và nhiều thứ khác, lẽ quyền , dấu thời gian, vv, nhưng tôi nghĩ rằng nó có thể không xử lý các liên kết cứng như liên kết cứng và có lẽ sẽ tạo ra chúng như là các tập tin unlinked riêng biệt.

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