หลีกเลี่ยงข้อผิดพลาดจาก tar ล้มเหลวในการกู้คืนการอนุญาตไดเรกทอรี


13

ฉันสังเกตพฤติกรรมดังต่อไปนี้กับทั้ง tar 1.26 และ 1.27.1:

$ mkdir a b a/diffowner
$ sudo mkdir b/diffowner
$ sudo chmod a+w b/diffowner
$ echo foo > a/diffowner/foo
$ tar -C a -cvf test.tar diffowner
diffowner/
diffowner/foo
$ tar -C b -xvf test.tar diffowner
diffowner/
diffowner/foo
tar: diffowner: Cannot utime: Operation not permitted
tar: diffowner: Cannot change mode to rwxr-xr-x: Operation not permitted
tar: Exiting with failure status due to previous errors

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

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

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


1
สงสัยว่ามีวิธีการทำเช่นนี้ในเวลาการสร้าง tar ซึ่งแตกต่างจากการแยก .. ?
Roy Truelove

คำตอบ:


22

tarตัวเลือกนี้อาจเป็นสิ่งที่คุณกำลังมองหา:

 --no-overwrite-dir
       preserve metadata of existing directories

ฉันทดสอบดังนี้:

$ mkdir a b a/diffowner
$ sudo mkdir b/diffowner
$ sudo chmod a+w b/diffowner
$ echo foo > a/diffowner/foo
$ tar -C a -cvf test.tar diffowner
diffowner/
diffowner/foo
$ tar -C b --no-overwrite-dir -xvf test.tar diffowner
diffowner/
diffowner/foo
$ echo $?
0

1
ยังใช้งานได้กับกรณีของฉันซึ่งฉันได้แยกไฟล์เก็บถาวร tar ไปยังส่วนแบ่ง Samba ที่ติดตั้ง โปรดทราบว่าแตกต่างจากคำสั่งแนะนำมันยังยับยั้งข้อผิดพลาดเมื่อปลายทางว่างเปล่า (เช่นไดเรกทอรีทั้งหมดที่จะให้ข้อผิดพลาดถูกสร้างขึ้นโดย tar ตัวเอง) ขอบคุณอีกครั้ง!
user149408
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.