rsync: ข้ามไฟล์ที่ฉันไม่มีสิทธิ์


16

ฉันใช้rsync -rlptDเพื่อคัดลอกไดเรกทอรีจากผู้ใช้รายอื่น มีไฟล์อยู่สองสามไฟล์ (ฉันไม่ทราบวิธีการเหล่านี้ล่วงหน้า) ซึ่งฉันไม่ได้รับอนุญาตให้คัดลอก มีวิธีที่ rsync ไม่สนใจสิ่งเหล่านี้หรือไม่ ปัญหาคือว่าถ้า rsync กลับไม่ใช่ศูนย์ bash -x สคริปต์ของฉันจะออก


Rsync มีค่าออกเอกสารที่ดี คุณไม่ควรถือว่าพวกเขาทั้งหมดเป็นความล้มเหลวหากสถานการณ์ของคุณไม่ได้เรียกร้องให้มันเป็นความล้มเหลว
jordanm

@ จอร์แดน แต่ไม่มีรหัสข้อผิดพลาดเฉพาะเจาะจงพอที่จะระบุข้อผิดพลาดนี้เท่านั้น
Gilles 'SO- หยุดความชั่วร้าย'

คำตอบ:


7

Rsync ไม่มีตัวเลือกสำหรับสิ่งนี้ ฉันเห็นทางแก้ไขสองทาง หนึ่งคือการแยกวิเคราะห์ข้อความผิดพลาด rsync; สิ่งนี้ไม่แข็งแกร่งมาก อื่น ๆ คือการสร้างรายการของไฟล์ที่ไม่สามารถอ่านได้เพื่อกรอง

cd /source/directory
exclude_file=$(mktemp)
find . ! -readable -o -type d ! -executable |
  sed -e 's:^\./:/:' -e 's:[?*\\[]:\\1:g' >>"$exclude_file"
rsync -rlptD --exclude-from="$exclude_file" . /target/directory
rm "$exclude_file"

หากคุณfindไม่มี-readableและ-executableแทนที่ด้วย-permคำสั่งที่เหมาะสม

สิ่งนี้ถือว่าไม่มีไฟล์ที่ไม่สามารถอ่านได้ซึ่งมีชื่อขึ้นบรรทัดใหม่ หากคุณต้องการรับมือกับสิ่งเหล่านี้คุณจะต้องสร้างรายการไฟล์ที่มีการคั่นด้วย null เช่นนี้และส่ง-0ตัวเลือกไปที่rsync:

find . \( ! -readable -o -type d ! -executable \) -print0 |
  perl -0000 -pe 's:\A\./:/:' -e 's:[?*\\[]:$1:g' >>"$exclude_file"

นี่อาจเป็นทางออกที่ดีที่สุดของเขา หวังว่าเขาจะต้องเรียกใช้สิ่งนี้เพียงครั้งเดียวเนื่องจากต้องใช้stat()ทุกไฟล์สองครั้ง (ครั้งเดียวผ่าน rsync และอีกครั้งผ่านการค้นหา) จะไม่ดีเลย
jordanm

@Gilles ดูเหมือนว่าจะทำงานได้ยกเว้นไฟล์ที่ซ่อนอยู่ ฉันสมมติว่ากลยุทธ์เดียวกันนี้จะทำงานร่วมกับการปรับแต่งเล็กน้อย ฉันไม่คุ้นเคยกับ \! (เครื่องหมายตกใจ) คุณสามารถอธิบายได้ไหม
JeffCharter

1
@JeffC \!เสนอราคาตัว!ดำเนินการเพื่อป้องกันการขยายตัวของเชลล์ แบ็กสแลชไม่จำเป็นจริงๆที่นี่เนื่องจากไม่มีเชลล์ขยาย!เมื่อตามด้วยช่องว่าง แต่ไม่เจ็บ เกิดอะไรขึ้นกับไฟล์ที่ซ่อนอยู่
Gilles 'หยุดความชั่วร้าย' ใน

3

ฉันทำวิธีแก้ปัญหาง่ายๆสำหรับสถานการณ์เฉพาะนี้:

rsync --args || $(case "$?" in 0|23) exit 0 ;; *) exit $?; esac)

สิ่งนี้จะส่งคืน0ถ้ารหัสที่ส่งคืนเป็น 0 หรือ 23 และส่งคืนรหัสทางออกในกรณีอื่นทั้งหมด

อย่างไรก็ตามสิ่งสำคัญคือให้สังเกตว่าสิ่งนี้จะเพิกเฉยต่อPartial transfer due to errorข้อผิดพลาดทั้งหมดไม่ใช่เฉพาะสิทธิ์ที่ได้รับอนุญาตเนื่องจากมันจะจับทุกอย่างที่ออกจากโค้ด23เพราะมันจะจับทุกอย่างที่ออกรหัสสำหรับข้อมูลเพิ่มเติมเกี่ยวกับรหัสสถานะ rsync โปรดดูที่ลิงค์นี้

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