คัดลอกการอนุญาตไฟล์ แต่ไม่ใช่ไฟล์ใน Unix


14

(จาก: /programming/15245144/copy-file-permissions-but-not-filesปิดเพราะปิดหัวข้อ)

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

สมมติว่าสิ่งเหล่านี้อยู่ในไดเรกทอรี:

version1/
version2/

ปัญหาคือว่าการอนุญาตใน version1 / เกิดความสับสนและฉันต้องการคัดลอกการอนุญาตจาก version2 / แต่ทำได้โดยไม่ต้องแทนที่ไฟล์ใน version1 / ซึ่งใหม่กว่า

มีวิธีอัตโนมัติในการทำเช่นนี้ผ่านคำสั่งเชลล์หรือสคริปต์?


ที่นี่มีสคริปต์ที่เป็นประโยชน์ใน perl ที่คุณสามารถใช้ serverfault.com/questions/373058/…
NoNoNo

คำตอบ:


15

GNU cp รู้จักการ--attributes-onlyตั้งค่าสถานะตั้งแต่coreutils 8.6

- คุณสมบัติ - อย่างเดียวไม่ได้คัดลอกข้อมูลไฟล์เพียงคุณสมบัติ


1
รุ่นของฉันไม่ได้ดูเหมือนจะมีธงที่และโพสต์บางคนดูเหมือนจะมีคำเตือนที่น่ากลัวเช่น
shearn89

14

เวอร์ชันของฉันcpไม่มีการ--attributes-onlyตั้งค่าสถานะดังนั้นฉันจึงทำสิ่งนี้ ทดสอบโดยย่อเกี่ยวกับโฟลเดอร์อย่างง่าย YMMV

$> ls
version1/
version2/
$> ls -l version1/1/a
-rw-rw-r-- 1 alex alex 0 Feb  5 12:49 version1/1/a
$> ls -l version2/1/a
-rwxrwxrwx 1 alex alex 0 Feb  5 12:49 version1/1/a

$> find version1 -type f -printf '%P\n' | xargs -I {} \
    chmod --reference=version1/{} version2/{}

$> ls -l version2/1/a
-rw-rw-r-- 1 alex alex 0 Feb  5 12:49 version1/1/a

5

คุณทำได้ แต่ฉันไม่คิดแบบ "อัตโนมัติ"!

GNU chown และ GNU chmod มี--reference=RFILEพารามิเตอร์ที่คุณสามารถใช้ได้

chown --reference=RFILE yourfile
chmod --reference=RFILE yourfile

โดยจะใช้RFILEการตั้งค่า (สิทธิ์เจ้าของกลุ่ม ฯลฯ .. ) yourfileและสำเนาให้พวกเขา

คู่มืออธิบายรายละเอียดเพิ่มเติม


0

ในกรณีของฉันฉันแก้ไขโดยใช้คำสั่ง "stat" กับ "find" และ "vi" เพื่อสร้างสคริปต์ที่ใช้สิทธิ์

cd version1/
find . -exec stat -c '%a %n' "{}" \; > setPerm.sh
vi setPerm.sh

ลงใน "vi" ฉันแทรกเข้าไปในทุกบรรทัดคำสั่ง "chmod": %s/^/chmod /g ฉันคัดลอกสคริปต์ในversion2/ไดเรกทอรีและดำเนินการ

โซลูชันอื่น ๆ ดูเหมือนจะใช้ได้ แต่ฉันไม่ได้ทดสอบพวกเขาในกรณี


0

แรงบันดาลใจจากคำตอบของ Mariano Paniga ฉันคิดว่าฉันมีดีกว่าที่ไม่จำเป็นต้อง vi และค้นหา / แทนที่คำสั่ง ฉันยังต้องการคัดลอกข้อมูลความเป็นเจ้าของด้วย (uid / gid)

cd version1/
find . -exec stat -c 'chmod %a %n; chown %U:%G %n' "{}" \; > /tmp/setPerm.sh
chmod u+x /tmp/setPerm.sh
cd ../version2
/tmp/setPerm.sh

คุณสามารถปรับแต่งคำสั่งภายในstat -c '...'เป็นอะไรก็ได้ที่คุณต้องการ man statสำหรับตัวเลือกทั้งหมดที่มีอยู่ให้ดู


สคริปต์ของคุณจัดการกับชื่อขึ้นบรรทัดใหม่หรือไม่
Deer Hunter

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