RSYNC ไม่ลบไดเรกทอรีที่มา


27

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

สิ่งนี้จะลบไฟล์บนเซิร์ฟเวอร์ต้นทางได้สำเร็จอย่างไรก็ตามไดเรกทอรีว่างยังคงอยู่ ฉันไม่ได้รับข้อความหรือข้อผิดพลาดใด ๆ เอาต์พุตทั้งหมดเป็นเรื่องปกติ บางทีนี่อาจเป็นฟังก์ชันที่ตั้งใจไว้

ฉันจะบอก rsync ให้ล้างทุกอย่างรวมถึงไดเรกทอรีได้อย่างไร

rsync --progress -vrzh --remove-source-files

เวอร์ชันคือ 3.0.9 ทั้งสองด้าน


คำตอบ:


13

พฤติกรรมของ--remove-source-filesสิ่งที่คุณสังเกตเห็นนั้นเป็นไปตามที่ระบุไว้โดยman rsync:

--remove แหล่งที่มาของไฟล์

   This tells rsync to remove from the sending side the files (meaning non-directories) that are a part of the transfer and have been successfully duplicated on the receiving side.

ไม่มีคำสั่งเฉพาะในการลบไดเรกทอรีเนื่องจากการสนทนาทั้งสองในStackExchangeและServerFaultแสดงอย่างชัดเจน วิธีแก้ปัญหาที่แนะนำคือการออกคำสั่งแยกกันสองคำสั่ง:

 rsync -av --ignore-existing --remove-source-files source/ destination/ && \
 rsync -av --delete `mktemp -d`/ source/ 

ชิ้นส่วนสุดท้ายของคำสั่งที่แนะนำในโพสต์ทั้งสองนี้

 rmdir source/

ซึ่งจำเป็นในการลบไดเรกทอรีแหล่งที่มา (ตอนที่ว่างเปล่า) มีแบบฟอร์มนี้ในโพสต์เหล่านี้เนื่องจาก OPs และคำตอบกำลังใช้ rsync เพื่อย้ายไฟล์จำนวนมากภายในเครื่องเดียวกัน ในกรณีของคุณคุณจะต้องทำด้วยตนเอง


5
rsync --deleteข้อเสนอแนะที่เป็นอันตรายเพราะมันไม่สนใจความเป็นไปได้ที่ rsync ไม่เสร็จสมบูรณ์หรือมีไฟล์ใหม่ที่แหล่งที่มา findวิธีการ@ slhck ด้านล่างปลอดภัยกว่ามาก
Sai

29

manpage พูดว่า:

--remove-source-files   sender removes synchronized files (non-dirs)

หากคุณต้องการลบไดเรกทอรีว่างเปล่าในแหล่งที่มาของคุณหากยังมีไฟล์เหลือให้ทำ:

find . -depth -type d -empty -delete

แต่สำหรับไดเรกทอรีรากที่ว่างเปล่าrm -rf <directory>แน่นอนว่าพอเพียงแล้ว


5
ใช่นี่เป็นทางออกเดียว มันเป็นคุณสมบัติที่ขาดหายไปอย่างโง่ ๆ ของ rsync ... rsync รู้เมื่อมันประมวลผลไฟล์สุดท้ายในไดเรกทอรี ... มันง่ายพอที่จะลบ dir ด้วยถ้าว่างเปล่า
Erik Aronesty

4
ระวังว่าการออก "rm -rf" นั้นเป็นไปได้ที่สภาพการแข่งขันจะแย่
Raúl Salinas-Monteagudo

ตัวแปรที่ไม่ได้ลบไดเรกทอรีว่างระดับบนสุด:find some_dir -depth -type d -empty -not -path some_dir -delete
Cameron Tacklind

5

การใช้ " rm -rf " มีเงื่อนไขการแข่งขันโดยธรรมชาติคุณสามารถลบไฟล์ที่สร้างขึ้นระหว่างrsyncและการเรียกใช้rm

ฉันชอบที่จะใช้:

rsync - ลบไฟล์ต้นฉบับ - เซิร์ฟเวอร์: ขาเข้า / ขาเข้า / &&

เซิร์ฟเวอร์ ssh ค้นหา -type d -delete ขาเข้า

การทำเช่นนี้จะไม่ลบไดเรกทอรีหากไม่ว่างเปล่า


2
rm -rfยังจะลบไฟล์ที่ไม่ได้ถูกโอนด้วยเหตุผลบางอย่าง
Kristian

1
คำตอบนี้ขาด-depthตัวเลือกที่แนะนำfindให้ดำเนินการในลำดับที่ถูกต้อง อันเป็นผลมาจากการพลาดนี้ไดเรกทอรีที่มีเฉพาะไดเรกทอรีที่ว่างเปล่า (อาจจะเรียกซ้ำ) จะไม่ถูกลบ ตัวแปรโดย @slhck ทำให้ถูกต้อง
Stéphane Gourichon

1

-m, --prune-empty-dirs ตัดลูกโซ่ไดเรกทอรีว่างเปล่าออกจากรายการไฟล์

--force บังคับให้ลบ dirs แม้ว่าจะไม่ว่างเปล่า


1
นั่นเป็นเพียงการป้องกัน rsync จากการคัดลอก dirs ที่ว่างเปล่า มันไม่ได้ลบ dirs ที่ว่างเปล่า
Navin

1

ลบซอร์สไฟล์จากนั้นลบไดเร็กทอรีที่ปลอดภัย

# given this scenario where you generate folders 2014-01-01 etc.. that have an archive myfile.tar.gz
pushd $(mktemp -d)
mkdir 201{4..6}-{01..12}-{01..31}
for i in $(ls); do; touch $i/myfile.tar.gz;done;
# find and rsync on 10 CPU threads directories that match ./2015-*
find /tmp/tmp.yjDyF1jN70/src -type d -name '2015-*' | \
parallel \
--jobs 10 \
--progress \
--eta \
--round-robin \
rsync \
--hard-links \
--archive --verbose --protect-args \
--remove-source-files \
{} /tmp/tmp.yjDyF1jN70/dest
# now safely remove empty directories only
for i in $(ls /tmp/tmp.yjDyF1jN70/src); do; rmdir /tmp/tmp.yjDyF1jN70/src/$i; done;

เพิ่มเติมเกี่ยวกับGNU Parallel

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