Để tạo danh sách các tệp mới hoặc sửa đổi theo chương trình, giải pháp tốt nhất tôi có thể đưa ra là sử dụng rsync , sort và uniq :
(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq
Hãy để tôi giải thích với ví dụ này: chúng tôi muốn so sánh hai bản phát hành dokuwiki để xem tệp nào đã được thay đổi và tệp nào mới được tạo.
Chúng tôi lấy các tars bằng wget và trích xuất chúng vào các thư mục old/
và new/
:
wget http://download.dokuwiki.org/src/dokuwiki/dokuwiki-2014-09-29d.tgz
wget http://download.dokuwiki.org/src/dokuwiki/dokuwiki-2014-09-29.tgz
mkdir old && tar xzf dokuwiki-2014-09-29.tgz -C old --strip-components=1
mkdir new && tar xzf dokuwiki-2014-09-29d.tgz -C new --strip-components=1
Chạy rsync một cách có thể bỏ lỡ các tệp mới được tạo khi so sánh rsync và diff hiển thị ở đây:
rsync -rcn --out-format="%n" old/ new/
mang lại sản lượng sau:
VERSION
doku.php
conf/mime.conf
inc/auth.php
inc/lang/no/lang.php
lib/plugins/acl/remote.php
lib/plugins/authplain/auth.php
lib/plugins/usermanager/admin.php
Chỉ chạy rsync theo một hướng sẽ bỏ lỡ các tệp vừa tạo và vòng ngược lại sẽ bỏ lỡ các tệp đã bị xóa, so sánh đầu ra của diff:
diff -qr old/ new/
mang lại sản lượng sau:
Files old/VERSION and new/VERSION differ
Files old/conf/mime.conf and new/conf/mime.conf differ
Only in new/data/pages: playground
Files old/doku.php and new/doku.php differ
Files old/inc/auth.php and new/inc/auth.php differ
Files old/inc/lang/no/lang.php and new/inc/lang/no/lang.php differ
Files old/lib/plugins/acl/remote.php and new/lib/plugins/acl/remote.php differ
Files old/lib/plugins/authplain/auth.php and new/lib/plugins/authplain/auth.php differ
Files old/lib/plugins/usermanager/admin.php and new/lib/plugins/usermanager/admin.php differ
Chạy rsync cả hai cách và sắp xếp đầu ra để loại bỏ trùng lặp cho thấy thư mục data/pages/playground/
và tệp data/pages/playground/playground.txt
ban đầu bị bỏ sót:
(rsync -rcn --out-format="%n" old/ new/ && rsync -rcn --out-format="%n" new/ old/) | sort | uniq
mang lại sản lượng sau:
VERSION
conf/mime.conf
data/pages/playground/
data/pages/playground/playground.txt
doku.php
inc/auth.php
inc/lang/no/lang.php
lib/plugins/acl/remote.php
lib/plugins/authplain/auth.php
lib/plugins/usermanager/admin.php
rsync
được chạy với các đối số luận đề:
-r
để "recurse vào thư mục",
-c
để so sánh các tệp có kích thước giống hệt nhau và chỉ "bỏ qua dựa trên tổng kiểm tra, không phải thời gian và kích thước mod",
-n
để "thực hiện chạy thử mà không có thay đổi nào được thực hiện" và
--out-format="%n"
thành "cập nhật đầu ra bằng FORMAT được chỉ định", đó là "% n" ở đây chỉ cho tên tệp
Đầu ra (danh sách các tệp) của rsync
cả hai hướng được kết hợp và sắp xếp bằng cách sử dụng sort
và danh sách được sắp xếp này sau đó được cô đọng bằng cách xóa tất cả các bản sao vớiuniq