ฉันสามารถใช้ rsync เพื่อสร้างรายการไฟล์ที่เปลี่ยนแปลงเท่านั้นได้หรือไม่


26

ฉันกำลังใช้ rsync ในสคริปต์ทุบตีเพื่อให้ไฟล์ซิงค์ระหว่างเซิร์ฟเวอร์สองสามตัวกับ NAS ปัญหาหนึ่งที่ฉันพบคือพยายามสร้างรายการไฟล์ที่มีการเปลี่ยนแปลงจากระหว่าง rsync

ความคิดคือว่าเมื่อผมทำงาน rsync ฉันสามารถส่งออกไฟล์ที่มีการเปลี่ยนแปลงลงในแฟ้มข้อความ - มากขึ้นหวังสำหรับอาร์เรย์ในหน่วยความจำ - แล้วก่อนสคริปต์ที่มีอยู่ฉันสามารถเรียกใช้ chown บนเพียงไฟล์เปลี่ยน

มีใครพบวิธีที่จะทำงานเช่นนี้หรือไม่?

# specify the source directory
source_directory=/Users/jason/Desktop/source

# specify the destination directory
# DO NOT ADD THE SAME DIRECTORY NAME AS RSYNC WILL CREATE IT FOR YOU
destination_directory=/Users/jason/Desktop/destination

# run the rsync command
rsync -avz $source_directory $destination_directory

# grab the changed items and save to an array or temp file?

# loop through and chown each changed file
for changed_item in "${changed_items[@]}"
do
        # chown the file owner and notify the user
        chown -R user:usergroup; echo '!! changed the user and group for:' $changed_item
done

→ดูanwer ของฉันที่นี่ นอกจากนี้ยังมี-iมากขึ้นสำหรับการลงรายละเอียด แต่มีไม่กี่บิด ...
แฟรงก์ Nocke

คำตอบ:


42

คุณสามารถใช้ตัวเลือกrsync --itemize-changes( -i) เพื่อสร้างเอาต์พุตแยกวิเคราะห์ที่มีลักษณะดังนี้:

~ $ rsync src/ dest/ -ai
.d..t.... ./
>f+++++++ newfile
>f..t.... oldfile

~ $ echo 'new stuff' > src/newfile

~ $ !rsync
rsync src/ dest/ -ai
>f.st.... newfile

>ตัวละครในตำแหน่งแรกที่บ่งชี้ไฟล์ที่ได้รับการปรับปรุง, ตัวอักษรที่เหลือแสดงให้เห็นว่าทำไมยกตัวอย่างเช่นที่นี่sและtแสดงให้เห็นว่าขนาดของไฟล์และเวลาที่มีการเปลี่ยนแปลง

วิธีที่รวดเร็วและสกปรกในการรับรายการไฟล์อาจเป็น:

rsync -ai src/ dest/ | egrep '^>'

การแยกวิเคราะห์ขั้นสูงมากขึ้นอย่างเห็นได้ชัดสามารถสร้างผลลัพธ์ที่สะอาดกว่า :-)

ฉันเจอลิงค์ที่ยอดเยี่ยมนี้ในขณะที่พยายามค้นหาว่า--itemize-changesมีการเปิดตัวเมื่อใดมีประโยชน์มาก

http://andreafrancia.it/2010/03/understanding-the-output-of-rsync-itemize-changes.html (ลิงก์ที่เก็บถาวร)


2
สำหรับผลลัพธ์ที่สะอาดกว่าดังกล่าวrsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-runจะแสดงรายการไฟล์ที่แก้ไขเท่านั้น (การตรวจสอบที่แตกต่างกัน ) แน่นอนผู้รักษาขอบคุณ :) FYI การวาง--dry-runคำสั่งแทนการใช้nตัวเลือกคือวิธีที่ดีที่สุดสำหรับฉัน
MediaVince

เป็นหลักเช่นเดียวกับrsync -zavc src/ dest/ --dry-runโดยไม่ต้อง verbose
MediaVince

14

ใช้-nค่าสถานะรวมกับ-cค่าสถานะการตรวจสอบและ-iค่าสถานะ:

# rsync -naic test/ test-clone/
>fcst...... a.txt
>fcst...... abcde.txt
>fcst...... b.txt

ในตัวอย่างนี้มีการเปลี่ยนแปลงเพียงหนึ่งไฟล์ตามเนื้อหาของไฟล์เอง อย่างไรก็ตามไม่มีการซิงค์ไฟล์เนื่องจาก-nแฟล็ก

โบนัส

หากคุณต้องการรัน chown ในไฟล์ที่ถูกเปลี่ยนให้แยกวิเคราะห์ไฟล์ด้วยsedหรือคล้ายกันและประมวลผลด้วย xargs ตัวอย่างเช่น:

rsync -naic test/ test-clone/ | sed 's/............//' | xargs -I+ sudo chown root "test-clone/+"

3
sed->cut -d ' ' -f2,-
MUY เบลเยี่ยม

-n --dry-run, -c --checksum,-i --itemize-changes
ThorSummoner

ฉันไม่ได้ติดตาม ทั้งสามไฟล์ในตัวอย่างมีการทำเครื่องหมาย '> fcst' ซึ่งฉันเข้าใจว่าหมายถึง 'ได้รับจากระยะไกล' การตรวจสอบแตกต่างกันแตกต่างกันขนาดแตกต่างกันเวลาแตกต่างกัน ในผลลัพธ์แสดงว่า "มีเพียงไฟล์เดียวที่มีการเปลี่ยนแปลง" ??
bobpaul

1

คำถามนี้ค่อนข้างเก่า แต่ฉันคิดว่าควรเพิ่ม:

-i เป็นทางลัดของ --out-format=%i%n%L

และ%nหมายถึงชื่อไฟล์ (ส่วนlog formatของman rsyncd.conf)

PS rsync เวอร์ชั่น 3.1.0


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