Đáng ngạc nhiên là không có câu trả lời nào trong 6 năm sử dụng -i
tùy chọn hoặc cho đầu ra tốt đẹp nên tôi sẽ đi đây:
TLDR - Chỉ cho tôi thấy các lệnh
rsync -rin --ignore-existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^[^ ]* /L /'
rsync -rin --ignore-existing "$RIGHT_DIR"/ "$LEFT_DIR"/|sed -e 's/^[^ ]* /R /'
rsync -rin --existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^/X /'
Hiểu đầu ra
Đây là một ví dụ về đầu ra:
L file-only-in-Left-dir
R file-only-in-right-dir
X >f.st...... file-with-dif-size-and-time
X .f...p..... file-with-dif-perms
Lưu ý ký tự đầu tiên của mỗi dòng:
L
/ R
có nghĩa là tệp / dir chỉ xuất hiện ở thư mục L
eft hoặc R
ight.
X
có nghĩa là các tập tin xuất hiện trên cả hai mặt nhưng là không giống nhau (trong trường hợp này 11 ký tự tiếp theo cung cấp cho bạn thêm thông tin. s
, t
và p
miêu tả sự khác biệt trong s ize, t ime và p ermissions tương ứng - để biết thêm cố gắng man rsync
và tìm kiếm --itemize-changes
) .
Tùy chọn bổ sung bạn có thể muốn sử dụng
Nếu bạn cũng muốn so sánh chủ sở hữu / nhóm / quyền của các tệp, hãy thêm các tùy chọn -o
/ -g
/ -p
tương ứng. Cuối cùng lưu ý rằng theo mặc định, rsync coi hai tệp giống nhau nếu chúng có cùng tên, thời gian và kích thước. Điều này cực kỳ nhanh và hầu hết thời gian là quá đủ nhưng nếu bạn muốn chắc chắn 100% hãy thêm -c
vào để so sánh nội dung của các tệp có cùng tên, thời gian & kích thước.
TLDR - Chỉ cần cho tôi một kịch bản để gọi
Nó đây rồi Gọi nó như thế này
diff-dirs Left_Dir Right_Dir [options]
Tất cả các tùy chọn được đề cập ở trên trong phần "Tùy chọn bổ sung bạn có thể muốn sử dụng" cũng được áp dụng tại đây.
#!/bin/bash
# Compare two directories using rsync and print the differences
# CAUTION: options MUST appear after the directories
#
# SYNTAX
#---------
# diff-dirs Left_Dir Right_Dir [options]
#
# EXAMPLE OF OUTPUT
#------------------
# L file-only-in-Left-dir
# R file-only-in-right-dir
# X >f.st...... file-with-dif-size-and-time
# X .f...p..... file-with-dif-perms
#
# L / R mean that the file/dir appears only at the `L`eft or `R`ight dir.
#
# X means that a file appears on both sides but is not the same (in which
# case the next 11 characters give you more info. In most cases knowing
# that s,t,T and p depict differences in Size, Time and Permissions
# is enough but `man rsync` has more info
# (look at the --itemize-changes option)
#
# OPTIONS
#---------
# All options are passed to rsync. Here are the most useful for the purpose
# of directory comparisons:
#
# -c will force comparison of file contents (otherwise only
# time & size is compared which is much faster)
#
# -p/-o/-g will force comparison of permissions/owner/group
if [[ -z $2 ]] ; then
echo "USAGE: $0 dir1 dir2 [optional rsync arguments]"
exit 1
fi
set -e
LEFT_DIR=$1; shift
RIGHT_DIR=$1; shift
OPTIONS="$*"
# Files that don't exist in Right_Dir
rsync $OPTIONS -rin --ignore-existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^[^ ]* /L /'
# Files that don't exist in Left_Dir
rsync $OPTIONS -rin --ignore-existing "$RIGHT_DIR"/ "$LEFT_DIR"/|sed -e 's/^[^ ]* /R /'
# Files that exist in both dirs but have differences
rsync $OPTIONS -rin --existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^/X /'
Làm thế nào nó hoạt động?
Chúng tôi đang gọi rsync như thế này:
rsync -rin ...
Chúng tôi sử dụng -i
( --itemize-changes
) để yêu cầu rsync in một dòng đầu ra cho mỗi tệp chứa thông tin về bất kỳ sự khác biệt nào giữa hai thư mục. Chúng ta cần -n
loại bỏ hành vi bình thường của rsync (nghĩa là cố gắng đồng bộ hóa hai thư mục bằng cách sao chép / xóa tệp). chúng ta cũng cần -r
làm việc đệ quy cho tất cả các tệp / thư mục con.
Chúng tôi gọi rsync ba lần:
Cuộc gọi đầu tiên : in các tệp không tồn tại trong Dir_B. Chúng ta cần sử dụng --ignore-existing
để bỏ qua các tập tin tồn tại ở cả hai bên.
rsync -rin --ignore-existing $DIR_A/ $DIR_B/
Cuộc gọi thứ 2 : Chính xác như trước nhưng chúng tôi trao đổi thứ tự của DIR_A / DIR_B.
Cuộc gọi thứ 3 : Cuối cùng, chúng tôi sử dụng --existing
để chỉ kiểm tra các tệp xuất hiện trong cả hai thư mục.
rsync -rin --existing $DIR_A/ $DIR_B/