วิธีการพิมพ์ไฟล์ที่จะมีการเปลี่ยนแปลงโดยใช้ rsync?


32

มีวิธีรับ rsync เพื่อพิมพ์พา ธ แบบเต็มไปยังไฟล์ทั้งหมดที่แตกต่างกันหรือไม่โดยไม่ต้องโอนไฟล์จริง ๆ ?

หรือฉันต้องการวิธีที่จะกระจายไฟล์ข้ามต้นไม้สองต้น (เหนือ SSH) ตามการเปลี่ยนแปลงของขนาดหรือเวลาที่แก้ไขครั้งล่าสุดเท่านั้น

คำตอบ:


33

Rsync มีdry-runตัวเลือก:

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

ฉันไม่แน่ใจว่านี่คือสิ่งที่คุณต้องการ

หากคุณต้องการdiffไฟล์ข้ามต้นไม้สองต้นคุณอาจค้นหาแบบสองทิศทางซ้ำโดยใช้ find และ pipe เพื่อส่งออกไปยัง ls และ pipe ทั้งสองไปยังไฟล์ จากนั้นคุณสามารถใช้diffเพื่อเปรียบเทียบไฟล์


3
+1 สิ่งนี้ถูกสร้างขึ้นใน rsync รายละเอียดของผลลัพธ์--dry-runจะขึ้นอยู่กับการใช้-vและ--progress options- ดังนั้นหากคุณไม่ได้รับผลลัพธ์เลยให้ตรวจสอบตัวเลือกเหล่านี้ตามที่ต้องการ ฉันสังเกตเห็นว่ามันจะส่งชื่อไดเรกทอรีแม้ว่าไฟล์จะไม่เปลี่ยนแปลง แต่คุณสามารถกรองสิ่งเหล่านี้ได้โดยการส่งผ่านผลลัพธ์ผ่านsedหรือคล้ายกัน
David Spillett

4
แต่ - ทำงานแห้งดูเหมือนว่าจะแสดงไฟล์แม้ว่าพวกเขาจะเหมือนกัน
Quantum7

14

ฉันชอบที่จะใช้ - ออกรูปแบบเพื่อดูรายละเอียดท่อไปน้อย:

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

7

rsync -rvn localdir targetdir

-n หมายถึงแสดงการกระทำเท่านั้น (โดยไม่ต้องดำเนินการใด ๆ )

โปรดทราบว่าคุณต้องการ 'v' มิเช่นนั้นจะไม่แสดงอะไรให้คุณเห็น! (คำตอบที่เหลือลืมสิ่งนี้ ... )


2
สำหรับผู้ติดตาม -n เทียบเท่ากับ "--dry-run" :)
rogerdpack

1

สร้างคำตอบอื่น ๆ และhttps://serverfault.com/a/618740/114520

  • ใช้--dry-run(หรือ-n) เพื่อหลีกเลี่ยงการแก้ไข
  • ใช้--itemize-changes(หรือ-i) เพื่อค้นหาการเปลี่ยนแปลง
  • ใช้--archive(หรือ-a) เพื่อรับไดเรกทอรีย่อยทั้งหมด
  • ใช้egrepเพื่อกรองรายการที่เริ่มต้นด้วยจุด (ไม่มีการเปลี่ยนแปลง)

ซึ่งให้คุณ: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\."

หากคุณต้องการเพียงทางเดียวคุณอาจเปลี่ยนคำสั่ง:

  • สำหรับการเปลี่ยนแปลงจากต้นทางไปยังปลายทาง: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|<)"
  • สำหรับการเปลี่ยนแปลงจากปลายทางสู่แหล่งที่มา: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|>)"

และหากคุณต้องการเพียงไฟล์เท่านั้นเพิ่มawkมายากล:rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\." | awk '{print $2}'


0

ฉันจะไปเพื่อสิ่งนี้:

#! /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"

ตัวอย่างเช่น:

$ cd svn 
$ rsyncmeld myproject othermachine:myproject -v --exclude '*.svn' --exclude build

0

ความจริงของเรื่องคือถ้าคุณเรียกใช้rsync -v ...และส่งออกชื่อไฟล์ไปยังหน้าจอไฟล์นั้นจะถูกถ่ายโอน (หรือจะถูกถ่ายโอนหากคุณกำลังทำ --dry-run) หากต้องการตรวจสอบว่าเหตุใด rsync กำลังจะถ่ายโอนให้ใช้โหมดลงรายการ: https://serverfault.com/a/618740/27813

ดังที่คนอื่น ๆ สังเกตไว้โดยค่าเริ่มต้น rsync จะเปรียบเทียบตามขนาดไฟล์และเวลาประทับซึ่งทั้งคู่จะต้องตรงกัน "คัดลอกเดลต้า" เริ่มจากไฟล์นั้น หากคุณต้องการดูไฟล์ที่แตกต่างกันจริงๆให้ใช้โหมด "checksum" checksum

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.