Bagaimana cara mencetak file yang akan diubah menggunakan rsync?

32

Apakah ada cara untuk mendapatkan rsync untuk mencetak file file lengkap ke semua file yang berbeda tanpa benar-benar mentransfer file?

Atau, saya perlu cara untuk membedakan file di dua pohon (lebih dari SSH) hanya berdasarkan pada perubahan ukuran atau waktu modifikasi terakhir.

Joe Tsai
sumber

Jawaban:

33

Rsync memiliki dry-runopsi:

-n, --dry-run               show what would have been transferred

Saya tidak yakin apakah ini yang Anda inginkan.

Jika Anda ingin difffile 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 diffuntuk membandingkan file.

Vincent
sumber
3
+1, ini dibangun untuk rsync. Detail output --dry-runakan tergantung pada penggunaan Anda pada -vdan --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 output sedatau sejenisnya.
David Spillett
4
Tapi --dry-run sepertinya memperlihatkan file walaupun mereka identik.
Quantum7
14

Saya lebih suka menggunakan --out-format untuk melihat detailnya, lebih sedikit:

rsync -azh --dry-run --delete-after --out-format="[%t]:%o:%f:Last Modified %M" source destination | less
kabZX
sumber
7

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 ...)

Hugo Zaragoza
sumber
2
Untuk pengikut -n setara dengan "--dry-run" :)
rogerdpack
1

Membangun jawaban lain dan https://serverfault.com/a/618740/114520

  • gunakan --dry-run(atau -n) untuk menghindari modifikasi
  • gunakan --itemize-changes(atau -i) untuk menemukan perubahan
  • gunakan --archive(atau -a) untuk mendapatkan semua subdirektori
  • gunakan egrepuntuk 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:

  • untuk perubahan dari sumber ke tujuan: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|<)"
  • untuk perubahan dari tujuan ke sumber: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|>)"

Dan jika Anda hanya perlu file, tambahkan saja awksihir:rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\." | awk '{print $2}'

Yvan
sumber
0

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
Raúl Salinas-Monteagudo
sumber
0

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".

rogerdpack
sumber