rsync: หลีกเลี่ยงการลบไฟล์ที่ไม่ได้เป็นของผู้ใช้บางคน


1

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

ฉันได้ดูผ่านตัวเลือก rsync ต่างๆ แต่ฉันไม่พบสิ่งที่ฉันกำลังมองหา ฉันสามารถ--excludeหรือ--delete-excludedเพียง แต่ให้รูปแบบเพื่อให้ตรงกับชื่อไฟล์ไม่ใช่ข้อมูลเมตาอื่น ๆ (หรือฉันสามารถ?)

ทางเลือกอื่น แต่โซลูชันที่ค่อนข้างยุ่งยากอาจเปิดใช้งานสคริปต์ระยะไกลเช่นfind -not -perm $USER > excluded_filesและ rsync ยกเว้นสิ่งเหล่านั้น แต่ฉันไม่ต้องการทำเช่นนั้น

ความคิดใด ๆ

update: เพื่อชี้แจงข้อมูลบนแล็ปท็อปของฉันจะเป็นเพียงส่วนหนึ่งของข้อมูลบนเซิร์ฟเวอร์ นี่คือตัวอย่าง

  • แล็ปท็อปของฉันมีdir_1และdir_2
  • ฉัน rsync พวกเขาไปยังเซิร์ฟเวอร์; ตอนนี้เซิร์ฟเวอร์มีสอง dirs
  • ผู้ใช้รายอื่นเข้าสู่เซิร์ฟเวอร์และสร้างไดเรกทอรีใหม่ dir_3
  • ฉันยุ่งกับไฟล์ของฉันตอนนี้จะ rsync อีกครั้ง แต่ต้องใช้ - ลบ
  • ฉันต้องการที่จะ --delete เฉพาะไฟล์ที่ผมสร้างขึ้นในสถานที่แรกคือผู้ที่อยู่ในdir_1และdir_2, ไม่ dir_3

คนอื่นอาจสร้างไฟล์ในโฟลเดอร์ของคุณ? ทำไมคุณไม่สร้างโฟลเดอร์ชื่อ lorenzog ที่ไม่มีใครเขียนถึง?
user39559

@lorenzog: เวิร์กโฟลว์ของคุณดูแปลก: ฉันเข้าใจแล้วว่าคุณมีไฟล์บนแล็ปท็อปที่คุณไม่ได้เป็นเจ้าของและคุณต้องการคัดลอกเฉพาะไฟล์ที่คุณเป็นเจ้าของไปยังที่เก็บที่แชร์ ถูกต้องหรือไม่ คุณเคยคัดลอกไฟล์ในทิศทางอื่นหรือไม่?
Gilles

ฉันควรอธิบายสถานการณ์ให้ดีขึ้น ดูการแก้ไข
lorenzog

และผู้ใช้รายอื่นจะไม่สร้างไฟล์ภายใน dir_1 และ dir_2?
user39559

@ user39559 ใช่พวกเขาอาจทำและนั่นคือสาเหตุที่ฉันหวังว่า rsync สามารถค้นหาไฟล์เหล่านั้นและป้องกันไม่ให้ฉันลบพวกเขา
lorenzog

คำตอบ:


1

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

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

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


คุณทำข้อมูลให้ตรงกันแบบสองทาง Rsync ไม่ดีในเรื่องนี้: หากคุณลืมที่จะเรียกใช้หรือรันโดยไม่ตั้งใจในทิศทางที่ผิดคุณอาจสูญเสียงานโดยไม่มีการเตือน พร้อมเพรียงเป็นเครื่องมือที่ดีสำหรับการซิงโครไนซ์แบบสองทาง: มันซิงโครไนซ์แบบสองทิศทางเสมอและมันจะบ่นหากไฟล์มีการเปลี่ยนแปลงทั้งสองด้าน มันเป็นโอเพ่นซอร์สและรวมเข้ากับทั้งแพลตฟอร์ม unix และ Windows

น่าเสียดายที่ความพร้อมเพรียงไม่มีตัวเลือกในการข้ามไฟล์โดยเจ้าของ คุณสามารถสร้างรายชื่อที่ไม่มีfind -userแต่จะได้รับยุ่งและมีสภาพการแข่งขันที่ถ้าคนอื่นเพิ่มหรือลบไฟล์ระหว่างการทำงานของfindและเรียกใช้ของหรือunisonrsync

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


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

  • หากเครื่องที่ใช้ร่วมกันรองรับการเชื่อมโยงอย่างหนัก (ทุกสิ่งที่ทำและ Windows ทำมาตั้งแต่ NT4 ตราบใดที่คุณใช้ NTFS) มันง่ายพอที่จะสร้างสำเนาของที่เก็บที่มีฮาร์ดลิงก์ของไฟล์ของคุณเท่านั้น:

    cd /shared/repository
    find . -user "$USER" -exec sh -c 'mkdir -p "/my/view/${0%/*}" &&
                                  ln "$0" "/my/view/$0"' {} \;
    

    หรือด้วย zsh:

    autoload zmv
    zmv -L -Q '/shared/repository/(**/)(*)(u$UID)' "/my/view/$1$2"
    

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

  • หากเครื่องที่ใช้ร่วมกันรองรับFUSEคุณสามารถใช้มันเพื่อสร้างมุมมองสดของที่เก็บที่ใช้ร่วมกันที่มีเฉพาะไฟล์ของคุณ ฉันไม่รู้ระบบไฟล์ FUSE ใด ๆ ที่มีอยู่ที่สามารถทำได้ แต่bindfsก็เข้าใกล้ (ฉันไม่ได้ดูรหัสเพื่อประเมินความยากในการเขียนโค้ด)

  • คุณสามารถใช้LD_PRELOADเพื่อแทนที่readdir(หรือเทียบเท่า Windows) เมื่อใช้ rsync หรือพร้อมเพรียงเพื่อที่ว่ามันจะส่งคืนไฟล์ที่คุณเป็นเจ้าของเท่านั้น


สุกใส ขอบคุณสำหรับลิงค์ไม่ทราบว่ามีอยู่จริง การควบคุมเวอร์ชันไม่ได้เป็นตัวเลือกอีกต่อไปเมื่อเราเริ่มอัปโหลดวัตถุขนาดใหญ่ (ภาพยนตร์ 2gb, เอกสาร Microsoft Office ต่างๆที่มีรูปภาพขนาดใหญ่ในนั้นและสิ่งอื่น ๆ ที่คล้ายกัน)
lorenzog

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

@ user39559: Doh คุณพูดถูก ฉันยืนตามคำแนะนำของฉันที่จะใช้พร้อมเพรียงสำหรับการซิงโครไนซ์แบบสองทางโดยทั่วไป แต่จริงๆแล้วมันไม่ได้แก้ปัญหาของ lorenzog พร้อมเพรียงรองรับการละเว้นไฟล์ตามชื่อเท่านั้น ให้ฉันคิดเกี่ยวกับมันบางมากขึ้น ...
กิลส์

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