rsync จะไม่ลบไฟล์ที่ปลายทาง


22

ฉันพยายามทำมิเรอร์ไดเรกทอรีที่เปลี่ยนแปลงตลอดเวลาไปยังไดเรกทอรีอื่น ปัญหาของฉันคือ rsync จะไม่ลบไฟล์ที่ปลายทางหากไม่มีอยู่ในไดเรกทอรีต้นทางอีกต่อไป นี่คือสคริปต์สาธิต:

#!/bin/sh

set -x

DIR1=/tmp/1
DIR2=/tmp/2

rm -rf $DIR1
rm -rf $DIR2

mkdir $DIR1
mkdir $DIR2

echo "foo" > $DIR1/a
echo "bar" > $DIR1/b

rsync -a $DIR1/* $DIR2

rm -f $DIR1/a

rsync -a --delete $DIR1/* $DIR2

ls -1 $DIR2

นี่คือผลลัพธ์:

+ DIR1=/tmp/1
+ DIR2=/tmp/2
+ rm -rf /tmp/1
+ rm -rf /tmp/2
+ mkdir /tmp/1
+ mkdir /tmp/2
+ echo foo
+ echo bar
+ rsync -a /tmp/1/a /tmp/1/b /tmp/2
+ rm -f /tmp/1/a
+ rsync -a --delete /tmp/1/b /tmp/2
+ ls -1 /tmp/2
a
b

อย่างที่คุณเห็นไฟล์ "a" ยังคงปรากฏอยู่ในไดเรกทอรีปลายทางหลังจากที่ rsync ทำงานเป็นครั้งที่สองซึ่งไม่ใช่สิ่งที่ฉันต้องการ ฉันกำลังใช้ตัวเลือก '- ลบ' ผิดหรือไม่


ระวัง / * ที่ส่วนท้ายของไดเรกทอรีต้นทาง ซึ่งจะทำให้ rsync พิจารณาเฉพาะไฟล์เหล่านั้นแทนที่จะเป็นไดเร็กทอรีเอง (และไม่มีไฟล์ที่ไม่มีอยู่อีกต่อไป)
Walt Stoneburner

คำตอบ:


9

เหตุผลก็เพราะคุณโทร rsync บน / tmp / 1 / b ซึ่งจะไม่พิจารณาไฟล์ / tmp / 1 / a เลย

ความตั้งใจของคุณดูเหมือนจะซิงค์ไดเรกทอรี / tmp / 1 / - ถ้าคุณใช้ "/ tmp / 1 /" เป็นแหล่งข้อมูลแทนที่จะเป็นไฟล์แต่ละไฟล์มันจะสังเกตเห็นว่า "a" ถูกลบออกจากไดเรกทอรีและลบออก จากเป้าหมาย


23

*ลบ ตามที่กล่าวไว้ในหน้า rsync --deleteตัวเลือกไม่ทำงานกับรายการตัวแทน

ใช้สิ่งนี้แทน:

rsync -a --delete $DIR1/ $DIR2/

"- ลบคำสั่งนี้บอก rsync ให้ลบไฟล์ที่ไม่เกี่ยวข้องออกจากด้านที่รับ (ไฟล์ที่ไม่ได้อยู่ในฝั่งที่ส่ง) แต่สำหรับไดเรกทอรีที่ซิงโครไนซ์เท่านั้น คุณต้องขอให้ rsync ส่งไดเรกทอรีทั้งหมด ( dirหรือdir/) โดยไม่ใช้ wildcard สำหรับเนื้อหาของไดเรกทอรี (เช่นdir/*) เนื่องจาก wildcard ถูกขยายโดยเชลล์และ rsync จึงได้รับการร้องขอให้โอนไฟล์แต่ละไฟล์ไม่ใช่ไดเรกทอรีหลักของ ไฟล์ไฟล์ที่แยกออกจากการถ่ายโอนจะถูกแยกออกจากการเป็น ถูกลบเว้นแต่คุณจะใช้--delete-excludedตัวเลือกหรือทำเครื่องหมายกฎว่าเป็นการจับคู่เฉพาะในฝั่งการส่งเท่านั้น (ดูตัวดัดแปลงรวม / ไม่รวมในส่วนตัวกรองกฎ) "


นี่เป็นหน้าที่เดียวกับคำตอบของ Sven จากปี 2011
Rowan Hawkins

8

หากคุณเปลี่ยนบรรทัด rsync ที่สองเป็นrsync -a --delete $DIR1/ $DIR2(โดยไม่มี *) มันจะทำงาน เหตุผลก็คือว่าเปลือกขยาย*ไปที่ชื่อไฟล์ในไดเรกทอรีแรกซึ่งเป็นเพียงขในกรณีของคุณดังนั้นไฟล์หายไปจะไม่ได้รับการพิจารณาที่ทุกคนโดย rsync rsync -a --delete $DIR1/b $DIR2เป็นคำสั่งที่ได้รับการดำเนินการที่เป็นจริง

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