บางคนสามารถอธิบายคำสั่ง rsync นี้ให้ฉันได้ไหม


11

ใครสามารถบอกฉันว่าสิ่งนี้ทำอะไร?

rsync -uva --delete /srv/bkp01 /srv/offbk2/ > ~/offbkp01.log

มันลบbkp01และoffbk2และส่งบันทึกไปoffbkp01.log?


เขาไม่สามารถอ่านหน้าคนได้ อะไรทำให้คุณคิดว่าเขากำลังอ่านคำตอบอยู่ที่นี่? XD
Twinkles

2
ใครต้องการหน้าคนเมื่อคุณมีexplainshell.com/... ?!
Tom

คำตอบ:


33

หากต้องการแยกส่วนนี้ออกเป็นส่วน ๆ มีสองส่วนหลักตามด้วยบทสรุปและบันทึกย่อ:

  • rsyncสั่ง:
    rsync -uva --delete /srv/bkp01 /srv/offbk2/
  • การเปลี่ยนทิศทางเอาต์พุตที่ทำโดยเชลล์ที่รันคำสั่ง rsync:
    rsync-command > ~/offbkp01.log

rsync คำสั่ง:

คำสั่งฐาน:

  • rsync - ฉันถือว่าสิ่งนี้ไม่จำเป็นต้องมีคำอธิบายใด ๆ

ตัวเลือกคำสั่ง:

  • -uva - ชุดตัวเลือกอักขระเดียวเป็น (แบบสั้นและยาวที่แสดง):

    • -u --update- บอก rsync ว่าการปรับเปลี่ยนทั้งหมดควรใช้กับไฟล์บนปลายทางที่มีอายุเท่ากัน (และขนาดต่างกัน) หรือเก่ากว่าเก่ากว่าที่อยู่บนแหล่งที่มา นั่นคือ rsync ควรส่งต่อการเปลี่ยนแปลงจากแหล่งที่จะอัปเดตปลายทาง แต่ไม่ควรทำการเปลี่ยนแปลงใด ๆ ที่จะทำให้ไฟล์ปลายทางกลายเป็นเวอร์ชันเก่ากว่า

      มีข้อยกเว้นบางประการ ความแตกต่างของประเภท (เช่นหนึ่งไฟล์เป็นอีกแฟ้มหนึ่งเป็นไดเรกทอรี) จะทำให้เกิดการอัปเดตโดยไม่คำนึงถึงวันที่ Symlinks และไฟล์พิเศษอื่น ๆ ไม่สนใจตัวเลือกนี้ และที่สำคัญสิ่งนี้ไม่ส่งผลกระทบต่อไฟล์ที่ถูกลบ

    • -v --verbose- เพิ่มจำนวนของข้อมูล rsync ที่พิมพ์ออกมาในขณะที่ดำเนินการ หากไม่มีสิ่งนี้ rsync จะพิมพ์ (เกือบ?) ไม่มีอะไร ด้วยตัวเลือกนี้ as-is, rsync จะบอกคุณว่าไฟล์ใดที่กำลังถูกถ่ายโอนและใส่บทสรุปในตอนท้าย เพิ่มเติมvs เพิ่มข้อมูลที่พิมพ์แม้ว่าหน้าคนพูดมากกว่าสองvควรนำมาใช้เฉพาะเมื่อการแก้จุดบกพร่อง
    • -a --archive- นี่เทียบเท่ากับตัวเลือกอื่น ๆ ( -rlptgD) ที่รวมกัน ตามชื่อแบบยาวมันเป็นวิธีที่รวดเร็วในการตั้งค่าตัวเลือกทั่วไปมากมายสำหรับการเก็บถาวรไฟล์และไดเรกทอรี มันจะ:
      • -r --recursive- บอก rsync เพื่อคัดลอกไดเรกทอรีซ้ำ หากไม่มี-d --dirsตัวเลือกนี้หรือตัวเลือกที่เจาะจงมากขึ้นrsync ก็จะข้ามไดเรกทอรีใด ๆ ที่พบ (และบอกคุณเกี่ยวกับมันในเอาต์พุต)
      • -l --links- เมื่อแหล่งที่มาคือ symlink สร้าง symlink บนปลายทาง ขึ้นอยู่กับตัวเลือกอื่น ๆ symlink อาจถูกข้ามหรือทำเป็นสำเนาแยกต่างหาก (เช่นไดเรกทอรีจริงที่มีเนื้อหา (หรือสำเนาของไฟล์อื่น) แทน symlink)
      • -p --perms - ตั้งค่าการอนุญาตของไฟล์ปลายทางให้เหมือนกับไฟล์ต้นฉบับ
      • -t --times- ตั้งค่าเวลาการแก้ไขของไฟล์ปลายทางให้เหมือนกับไฟล์ต้นฉบับ เนื่องจากการซิงค์เวลาเหล่านี้ทำให้อัลกอริทึม rsync มีประสิทธิภาพมากขึ้นโดยทั่วไปคุณต้องการให้ใช้อย่างชัดเจนหรือโดยปริยาย
      • -g --group- ตั้งค่าแอตทริบิวต์กลุ่มของปลายทางให้เหมือนกับแหล่งที่มา เชื่อมโยงโดยใช้ชื่อตามค่าเริ่มต้น แต่จะถอยกลับไปยังหมายเลข ID กลุ่มในบางสถานการณ์ หากการรับ rsync ไม่ได้ทำงานในฐานะผู้ใช้ขั้นสูง (หรือแกล้งทำด้วย--fake-super) เฉพาะกลุ่มที่ผู้ใช้ที่เรียกใช้ rsync ที่ด้านการรับเท่านั้นที่สามารถเป็นสมาชิกได้ มิฉะนั้นกลุ่มจะถูกตั้งค่าเป็นกลุ่มเริ่มต้นของผู้ใช้เดียวกันที่กล่าวถึงก่อนหน้านี้
      • -D- เทียบเท่ากับตัวเลือก--devicesและ--specialsร่วมกัน พวกเขาหมายถึง:
        • --devices- ถ่ายโอนไฟล์ตัวละครและอุปกรณ์บล็อก จะไม่มีผลใด ๆ หากrsync ที่ได้รับนั้นไม่ได้ทำงานแบบผู้ใช้ระดับสูง (หรือแกล้งทำด้วย--fake-super)
        • --specials - ถ่ายโอนไฟล์พิเศษ (เช่นซ็อกเก็ต) (ไม่เช่นนั้นจะเป็น)
  • --delete- บอก rsync เพื่อลบไฟล์ที่อยู่ในปลายทาง แต่ไม่ได้อยู่ในแหล่งที่มา สิ่งนี้ไม่ได้รับผลกระทบจากตัวเลือกการอัปเดตที่ตั้งไว้ข้างต้น (จริง ๆ แล้วมันเป็นอย่างไรบ้างเนื่องจากระบบไฟล์ส่วนใหญ่จะไม่เก็บข้อมูลที่จำเป็นเพื่อดูว่าการกระทำใดที่ใหม่กว่า? ตัวเลือกนี้ทำงานกับแหล่งที่มาหลังจากการขยาย wildcard / glob ดังนั้น dir / * จึงไม่เหมือนกับ dir / หมายเหตุสำคัญบางประการ:
    • เห็นได้ชัดว่ามันอันตราย คุณควรลองด้วย--dry-runตัวเลือกก่อนซึ่งจะทำการโอนหลอกที่ช่วยให้คุณมั่นใจได้ว่าไม่มีการเปลี่ยนแปลงที่ไม่ตั้งใจ
    • หากมีข้อผิดพลาด I / O (อินพุต / เอาต์พุต) - นั่นคือหากมีสิ่งใดที่ผิดพลาดในการถ่ายโอนการอ่านหรือการเปลี่ยนแปลงการเขียน - การลบจะถูกละเว้นจากจุดนั้น สิ่งนี้สามารถแทนที่ได้ด้วย--ignore-errorsตัวเลือกแม้ว่าคุณอาจไม่ต้องการ / ไม่ต้องการทำเช่นนั้น
    • อัลกอริทึมการลบมีหลายรูปแบบซึ่งคุณสามารถอ่านเพิ่มเติมได้ในหน้า man เมื่อ rsync ที่ได้รับเป็นเวอร์ชั่น 3.0.0 หรือใหม่กว่า (ณ เวลาที่เขียนนี้) --delete-duringจะมีการใช้อัลกอริทึม หากตัวรับสัญญาณมีอายุมากกว่า--delete-beforeจะใช้งาน หากเป็นสิ่งสำคัญที่ไฟล์จะต้องมีความสอดคล้องที่แน่นอนควรเกิดข้อผิดพลาด (เช่นไม่ลบอะไรเลยจนกว่าจะมีการเปลี่ยนแปลงอื่น ๆ ทั้งหมด) คุณควรใช้ตัวเลือกที่เฉพาะเจาะจงมากกว่าแบบเริ่มต้น

ตำแหน่งคำสั่ง:

  • /srv/bkp01- ไฟล์ต้นฉบับหรือไดเรกทอรี มีกฎบางอย่างโดยละเอียดเกี่ยวกับความหมายถ้ามี / ไม่มีเครื่องหมายสแลชที่ท้ายไดเรกทอรีและถ้ามีไดเรกทอรีอื่นอยู่ คุณสามารถดูส่วนการใช้งานของหน้า man สำหรับรายละเอียด แต่ที่นี่ขาดเครื่องหมายทับหมายความว่าไดเรกทอรีนี้จะถูกคัดลอกไปยังปลายทางมากกว่าเนื้อหาของไดเรกทอรีนี้จะถูกคัดลอกไปยังปลายทาง เหมือนกันถ้านี่เป็นไฟล์แทนที่จะเป็นไดเร็กตอรี่
  • /srv/offbk2/- ไดเรกทอรีปลายทาง โดยทั่วไปนี่จะเป็นรายการสุดท้ายที่ปรากฏในส่วนคำสั่ง rsync ยกเว้นว่ามีการใช้ตัวเลือกเพื่อระบุที่อื่นในคำสั่ง

การเปลี่ยนเส้นทางของเชลล์ออก:

คำสั่งเชลล์:

  • >- สิ่งนี้จะเปลี่ยนเส้นทาง stdout (เอาต์พุตมาตรฐาน) จากสิ่งที่อยู่ทางซ้ายไปยังไฟล์ทางด้านขวากลายเป็นเนื้อหาและสร้างไฟล์ (ถ้าเป็นไปได้) หากยังไม่มีอยู่ หมายเหตุบางส่วน:
    • นอกจากนี้คุณยังสามารถเปลี่ยนเส้นทาง stderr (เอาต์พุตข้อผิดพลาดมาตรฐาน) ไปยังไฟล์เดียวกันโดยเพิ่ม2>&1ไปยังส่วนท้ายสุดของคำสั่งด้านบน การสั่งซื้อเป็นสิ่งสำคัญดังนั้นโปรดใช้ความระมัดระวังในการวางตำแหน่งที่จะวางไว้ หมายเลขเวทย์มนตร์1หมายถึง stdout 2หมายถึง stderr &คือ "ที่อยู่ของ" และส่วนคำสั่งเต็มหมายถึง "เปลี่ยนเส้นทางการส่งออกของ stderr ไปสู่สตรีม stdout"
    • หากคุณต้องการต่อท้ายไฟล์บันทึกแทนการแทนที่คุณสามารถใช้>>แทน วิธีการเปลี่ยนเส้นทาง stderr ไปยังตำแหน่งเดิมยังคงเหมือนเดิม
    • คุณสามารถส่ง stdout และ stderr 1> stdout_file 2> stderr_fileไปยังสถานที่ที่แตกต่างกันโดยใช้ คุณยังสามารถใช้>>แทน>คำสั่งนั้นในการทำเช่นนั้นโดยการผนวกแทนการแทนที่

ตัวแปรเชลล์ / สัญลักษณ์พิเศษ:

  • ~ - นี่เป็นการจดชวเลขสำหรับไดเรกทอรีหลักของผู้ใช้ปัจจุบันและเป็นส่วนหนึ่งของบิตถัดไป

ตำแหน่งระดับเชลล์:

  • ~/offbkp01.log- ไฟล์ offbkp01.log ภายในโฮมไดเรกทอรีของผู้ใช้ปัจจุบัน นี่คือที่การส่งออกของคำสั่ง rsync >จะใส่เพราะการเปลี่ยนเส้นทางด้วย

สรุป:

โดยสรุปคำสั่งนี้จะ:

  • คัดลอกทุกไฟล์ปกติไดเรกทอรี symlinks ไฟล์พิเศษและแฟ้มอุปกรณ์
  • เช่นเดียวกับส่วนใหญ่ถ้าไม่ได้ทั้งหมดแอตทริบิวต์ของไฟล์ที่สำคัญ ,
  • จาก /srv/bkp01 ,
  • เพื่อ /srv/offbk2/bkp01 ,
  • และจะลบสิ่ง/srv/offbk2/ที่ไม่ได้อยู่ใน/srv/bkp01เงื่อนไขต่อไปนี้:

    • หากปกติไฟล์ไดเรกทอรีหรือ symlink (?)มีการปรับเปลี่ยนเวลาใน/srv/offbk2/ ที่ใหม่กว่าปรับเปลี่ยนเวลาในวันที่/srv/bkp01, มันจะไม่ได้รับการปรับปรุง , ถ้าทั้งสองรายการยังคงเป็นประเภทเดียวกัน (ปกติไฟล์ไดเรกทอรีหรือ symlink (? ))
  • นอกจากนี้rsync จะพิมพ์ออกมาข้อมูลบางอย่างเกี่ยวกับสิ่งที่ทำ (เฉพาะไฟล์ที่ถูกโอนและบทสรุปสุดท้าย ) ซึ่งเปลือกจะเขียน ลงในแฟ้ม ~/offbkp01.logไฟล์บันทึกดังกล่าวจะถูกสร้างขึ้นใหม่หากยังไม่มีอยู่และจะถูกเขียนทับหากมีอยู่แล้ว


หมายเหตุ: --fake-superเป็นตัวเลือกที่ใช้ในการทำให้ rsync จำลองกิจกรรมผู้ใช้ขั้นสูง ทำได้โดยใช้แอตทริบิวต์เพิ่มเติมของไฟล์เพื่อจัดเก็บแอตทริบิวต์ที่ไม่สามารถตั้งค่าได้หากไม่มีสิทธิ์ที่มากกว่า เวอร์ชันจริงของแต่ละแอตทริบิวต์นั้นถูกตั้งค่าเป็นอะไรก็ตามที่สมเหตุสมผลเนื่องจากตัวเลือกและสิทธิพิเศษที่มีให้ แม้ว่าสิ่งนี้จะทำให้การสำรองข้อมูลบางอย่างสะดวกแม้ว่าคุณจะไม่มีสิทธิ์พิเศษสำหรับผู้ใช้ แต่ก็ควรทราบว่าอาจมีความเสี่ยงด้านความปลอดภัยมากกว่าการใช้ rsync โดยทั่วไปเนื่องจากอาจไม่มีการตั้งค่าแอตทริบิวต์ความปลอดภัยที่แท้จริง อย่างถูกต้องแม้ว่าข้อมูลเกี่ยวกับพวกเขาจะถูกสำรองไว้


ที่มา: จำนวนมากเวลาทำงานกับ rsync และการอ่านของคนหน้า


8
นั่นเป็นหนึ่งโพสต์แรกที่น่าประทับใจ หวังว่าคุณจะไปรอบ ๆ !
terdon

ฉันสอง @terdon .. เจ้ากรรม! เขาไฟไหม้ ติดตามเพื่อนที่ดีในการทำงาน นี่เป็นคำตอบที่น่าประทับใจอย่างแน่นอน
AzkerM

ดูเหมือนว่าคำตอบจะเป็น "Sherlock Holmes" ฉันชอบสไตล์การอธิบายของคุณ ..
ราหุลปาติล

9

จากคู่มือ:

--ลบ

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

ดังนั้นมันจะลบไฟล์ออกจากปลายทางที่ไม่ได้เป็นส่วนหนึ่งของไดเรกทอรีต้นฉบับหากคุณไม่ได้ใช้สัญลักษณ์แทน

ไดเรกทอรีแหล่งที่มา:

1.txt
2.txt
3.txt

ไดเรกทอรีปลายทาง:

4.txt

4.txt จะหายไปหลังจาก rsync และ 1.txt, 2.txt และ 3.txt จะอยู่ที่ปลายทาง


เกี่ยวกับสิ่งอื่น ๆ :

uva
  • อัปเดตไฟล์
  • verbose: echo results to terminal (เช่นเปลี่ยนเส้นทางไปยังไฟล์บันทึกของคุณดังนั้นใช่กับคำถามสุดท้าย)
  • เก็บถาวร: โหมดเก็บถาวร; เท่ากับ -rlptgoD (ไม่ใช่ -H, -A, -X)

ที่มา:man rsync
Sammitch

3

ไม่มันจะลบไฟล์ที่ไม่เกี่ยวข้องจากbkp01ไดเรกทอรีเท่านั้น

นอกจากนี้:

  • -u, --update- ข้ามไฟล์ที่ใหม่ต่อสัญญาณ
  • -v, --verbose- การเพิ่มฟุ่มเฟื่อย
  • -a, --archive- โหมดเก็บถาวร; เท่ากับ -rlptgoD (ไม่ใช่ -H, -A, -X)

เอาต์พุตของrsync -uva --delete /srv/bkp01 /srv/offbk2/คำสั่งถูกส่งไปยัง~/offbkp01.logไฟล์โดยใช้โอเปอเรเตอร์การเปลี่ยนเส้นทาง ( >)แทนที่จะพิมพ์ในเทอร์มินัลของคุณ หากไฟล์ไม่มีอยู่ไฟล์นั้นจะถูกสร้างขึ้น หากไฟล์มีอยู่เนื้อหาเก่าจะถูกลบ

ดูman rsyncข้อมูลเพิ่มเติม


3
ไม่ลบอะไรbkp01เลย มันเพียงแค่ลบไฟล์ที่ไม่เกี่ยวข้อง - เช่นไฟล์ที่ไม่มีอยู่ในแหล่งที่มา - จากปลายทาง
Matt Nordhoff

จะไม่มีการลบไฟล์จาก bkp01
ซาเวียร์ J

1
rsync 

รีโมตไฟล์คัดลอก - ซิงโครไนซ์ทรีไฟล์ข้ามดิสก์โลคัลไดเร็กทอรีหรือข้ามเครือข่าย

-u update 

-v verbose

-a archive


--delete --> delete

นี่มันจะลบไฟล์ภายใน offbk2

จากนั้นผลลัพธ์ของผลลัพธ์ (สำเร็จหรือไม่) จะถูกเปลี่ยนเส้นทางไปยังไฟล์บันทึกนั้น


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