Jawaban:
Rsync memiliki dry-run
opsi:
-n, --dry-run show what would have been transferred
Saya tidak yakin apakah ini yang Anda inginkan.
Jika Anda ingin diff
file di dua pohon, Anda mungkin bisa mencari dua arah secara rekursif dengan menemukan dan pipa untuk output ke ls dan pipa keduanya ke file. Anda kemudian dapat menggunakan diff
untuk membandingkan file.
rsync -rvn localdir targetdir
-N berarti menunjukkan tindakan saja (tanpa tindakan apa pun yang dilakukan).
Perhatikan bahwa Anda memerlukan 'v' atau tidak akan menunjukkan apa pun kepada Anda! (sisa jawabannya lupakan ini ...)
Membangun jawaban lain dan https://serverfault.com/a/618740/114520
--dry-run
(atau -n
) untuk menghindari modifikasi--itemize-changes
(atau -i
) untuk menemukan perubahan--archive
(atau -a
) untuk mendapatkan semua subdirektoriegrep
untuk menyaring entri yang dimulai dengan titik (tidak ada perubahan)Yang memberi Anda: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\."
Jika Anda hanya menginginkan satu cara, Anda dapat mengubah perintah:
rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|<)"
rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|>)"
Dan jika Anda hanya perlu file, tambahkan saja awk
sihir:rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\." | awk '{print $2}'
Saya akan melakukan sesuatu seperti ini:
#! /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"
Sebagai contoh:
$ cd svn
$ rsyncmeld myproject othermachine:myproject -v --exclude '*.svn' --exclude build
Kebenaran dari masalah ini adalah bahwa jika Anda menjalankan rsync -v ...
dan menampilkan nama file ke layar, file tersebut sedang ditransfer (atau akan ditransfer, jika Anda menjalankan --dry-run). Untuk memastikan mengapa rsync hendak mentransfernya, gunakan mode perincian: https://serverfault.com/a/618740/27813
Seperti yang telah dicatat oleh orang lain, secara default rsync hanya membandingkan berdasarkan ukuran file dan cap waktu, yang keduanya harus cocok dengan yang lain "delta copy" dimulai pada file itu. Jika Anda benar-benar ingin melihat file mana yang berbeda, gunakan mode checksum "-c".
--dry-run
akan tergantung pada penggunaan Anda pada-v
dan--progress options
- jadi jika Anda tidak mendapatkan output sama sekali, periksa opsi ini diatur sesuai kebutuhan. Saya perhatikan bahwa ia akan mengirim nama direktori bahkan ketika file tidak berubah, tetapi Anda dapat memfilter ini dengan melewatkan outputsed
atau sejenisnya.