Câu trả lời:
Rsync có một dry-run
tùy chọn:
-n, --dry-run show what would have been transferred
Tôi không chắc chắn nếu đây là những gì bạn muốn.
Nếu bạn muốn diff
các tệp trên hai cây, bạn có thể tìm kiếm đệ quy hai hướng bằng find và pipe để xuất ra ls và dẫn cả hai vào một tệp. Sau đó bạn có thể sử dụng diff
để so sánh các tập tin.
rsync -rvn localdir targetdir
-N có nghĩa là chỉ hiển thị các hành động (không có bất kỳ hành động nào được thực hiện).
Lưu ý rằng bạn cần 'v' hoặc nó sẽ không hiển thị cho bạn bất cứ điều gì! (phần còn lại của câu trả lời quên điều này ...)
Dựa trên các câu trả lời khác và https://serverfault.com/a/618740/114520
--dry-run
(hoặc -n
) để tránh sửa đổi--itemize-changes
(hoặc -i
) để tìm thay đổi--archive
(hoặc -a
) để có được tất cả các thư mục conegrep
để lọc ra các mục bắt đầu bằng dấu chấm (không thay đổi)Cung cấp cho bạn: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\."
Nếu bạn chỉ muốn một cách, bạn có thể thay đổi lệnh:
rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|<)"
rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|>)"
Và nếu bạn chỉ cần các tập tin, chỉ cần thêm awk
phép thuật:rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\." | awk '{print $2}'
Tôi sẽ đi cho một cái gì đó như thế này:
#! /bin/bash
set -eu ## Stop on errors and on undefined variables
## The local directory name
LOCAL_DIR=$1
## The remote directory in rsync sintax. Example: "machine:directory"
REMOTE_DIR=$2
shift
shift
# Now the first two args are gone and any other remaining arguments, if any,
# can be expanded with $* or $@
# Create temporary file in THIS directory (hopefully in the same disk as $1:
# we need to hard link, which can only made in the same partition)
tmpd="$(mktemp -d "$PWD/XXXXXXX.tmp" )"
# Upon exit, remove temporary directory, both on error and on success
trap 'rm -rf "$tmpd"' EXIT
# Make a *hard-linked* copy of our repository. It uses very little space
# and is very quick
cp -al "$LOCAL_DIR" "$tmpd"
# Copy the files. The final «"$@"» allows us to pass on arguments for rsync
# from the command line (after the two directories).
rsync -a "$REMOTE_DIR"/ "$tmpd/" --size-only "$@"
# Compare both trees
meld "$LOCAL_DIR" "$tmpd"
Ví dụ:
$ cd svn
$ rsyncmeld myproject othermachine:myproject -v --exclude '*.svn' --exclude build
Sự thật của vấn đề là nếu bạn chạy rsync -v ...
và nó xuất tên tệp ra màn hình, tệp đó sẽ được chuyển (hoặc sẽ được chuyển, nếu bạn đang thực hiện --dry-run). Để xác định lý do tại sao rsync sắp chuyển nó, hãy sử dụng chế độ ghi mục: https://serverfault.com/a/618740/27813
Như những người khác đã lưu ý, theo mặc định, rsync chỉ so sánh dựa trên kích thước tệp và dấu thời gian, cả hai phải khớp với "bản sao delta" khác được bắt đầu trên tệp đó. Nếu bạn thực sự muốn xem tập tin nào khác nhau, hãy sử dụng chế độ kiểm tra "-c".
--dry-run
sẽ phụ thuộc vào việc bạn sử dụng-v
và--progress options
- vì vậy nếu bạn không nhận được đầu ra nào, hãy kiểm tra các tùy chọn này được đặt khi cần thiết. Tôi đã nhận thấy rằng nó sẽ gửi tên thư mục ngay cả khi các tệp không thay đổi, nhưng bạn có thể lọc chúng bằng cách chuyển đầu ra quased
hoặc tương tự.