มีคำสั่งหรือการตั้งค่าสถานะเพื่อโคลนความเป็นเจ้าของผู้ใช้ / กลุ่มและการอนุญาตในไฟล์จากไฟล์อื่นหรือไม่? ที่จะทำให้ perms และความเป็นเจ้าของที่แน่นอนของไฟล์อื่นได้หรือไม่
มีคำสั่งหรือการตั้งค่าสถานะเพื่อโคลนความเป็นเจ้าของผู้ใช้ / กลุ่มและการอนุญาตในไฟล์จากไฟล์อื่นหรือไม่? ที่จะทำให้ perms และความเป็นเจ้าของที่แน่นอนของไฟล์อื่นได้หรือไม่
คำตอบ:
บน GNU / Linux chown
และchmod
มี--reference
ตัวเลือก
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
--reference
พารามิเตอร์ของchmod
และchown
ก่อน :)
บน Unix ใด ๆ กับสาธารณูปโภค GNU เช่น (ไม่ใช่ฝังตัว) Linux หรือ Cygwin คุณสามารถใช้และchmod --reference
chown --reference
หากระบบของคุณมีACLsลองคำสั่งของ ACL และgetfacl
setfacl
คำสั่งเหล่านี้แตกต่างกันเล็กน้อยจากระบบไปยังระบบ แต่ในหลาย ๆ คุณสามารถใช้getfacl other_file | setfacl -bnM - file_to_change
เพื่อคัดลอกสิทธิ์ สิ่งนี้ไม่ได้คัดลอกความเป็นเจ้าของ คุณสามารถทำได้ด้วยการแยกวิเคราะห์อย่างระมัดระวังls -l other_file
โดยสมมติว่าคุณไม่มีชื่อผู้ใช้หรือกลุ่มที่มีช่องว่าง
LC_ALL=C ls -l other_file | {
read -r permissions links user group stuff;
chown -- "$user:$group" file_to_change
}
getfacl other_file | setfacl -bnM - file_to_change
ทำคำสั่ง bashตามการตอบสนองของMatteo :)
รหัส:
chmod $( stat -f '%p' "$1" ) "${@:2}"
การใช้งาน:
cp-permissions <from> <to>...
${*:2}
ที่ไหน ไม่เคยทำเช่นนั้นอีกครั้ง! ซึ่งจะล้มเหลวหากชื่อไฟล์ใดมีช่องว่าง (หรือแท็บ) "${@:2}"
ใช้ นอกจากนี้ยังใช้แทนเพียง"$1"
$1
chmod "$(stat -c '%a' "$fromfile")" tofile
ใน GNU Coreutils แต่คุณอาจใช้--reference
ในกรณีนี้เนื่องจากstat
ยูทิลิตี้ CLI ไม่ใช่ POSIX มันยังบอกว่าpubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html นั่น ls -l
จะไม่ตัด: "ผลลัพธ์ของ ls (พร้อมกับ -l และตัวเลือกที่เกี่ยวข้อง) มีข้อมูลที่สามารถใช้ประโยชน์ได้โดยยูทิลิตี้เช่น chmod และ touch เพื่อกู้คืนไฟล์กลับสู่สถานะที่รู้จักอย่างไรก็ตามข้อมูลนี้นำเสนอในรูปแบบที่ไม่สามารถใช้โดยตรงจากยูทิลิตี้เหล่านั้นหรือ แปลเป็นรูปแบบที่สามารถใช้ได้ง่าย "
หากคุณไม่ได้ใช้ระบบที่มี chmod / chown ของ GNU (ซึ่งรองรับ--reference
ตัวเลือก) คุณสามารถลองแยกวิเคราะห์ผลลัพธ์ของls -l
นี่เป็นสคริปต์เล็ก ๆ สำหรับchmod
(ถ้าคุณเห็นว่าสนับสนุน regexes เพิ่มเติมพวกเขาสามารถเขียนในวิธีที่อ่านได้มากขึ้น ... )
#!/bin/sh
reference=$1
shift
files=$*
# strip the permissions (whith extended regexes could be more readable)
OWNER=$(ls -l ${reference} | sed -e "s/.\(...\).*/\1/" | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*/\1/" | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*/\1/" | sed -e "s/[-]//g" )
chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}
อัปเดต :
สิ่งนี้ง่ายยิ่งขึ้นเมื่อใช้stat
:
chmod $( stat -f '%p' ${reference} ) ${files}
ls -l
เอาต์พุตคุณสามารถแยกวิเคราะห์stat
เอาต์พุตได้
stat
ไวยากรณ์* BSD ที่นี่ chmod $(stat ...)
คำสั่งของคุณจะไม่ทำงานเพราะ%p
เพียงอย่างเดียวส่งออกข้อมูลมากเกินไปสำหรับ * BSD's chmod
ใช้%Lp
เพื่อส่งออกเพียงบิต u / g / o จะต้องมีบางสิ่งที่ซับซ้อนกว่านี้เล็กน้อยสำหรับบิตเหนียว / setuid / setgid
ฉันต้องการเพิ่มการปรับแก้สคริปต์ของMatteo ควรใช้สำหรับ for เพื่อตรวจสอบความถูกต้องของไฟล์ก่อนที่จะรันคำสั่ง chmod สิ่งนี้จะทำให้ข้อผิดพลาดของสคริปต์ออกมาได้อย่างสวยงามยิ่งขึ้น
ฉันคิดว่านี่เป็นตัวเลือกที่ดีที่สุดเพราะสามารถใช้ได้กับทุกระบบปฏิบัติการ * nix เช่น Solaris, Linux และอื่น ๆ
#!/bin/sh
reference=$1
shift
files=$*
for file in $reference $files; do
[ -f $file ] || { echo "$file does not exist"; exit 1; }
done
# strip the permissions (whith extended regexes could be more readable)
OWNER=$(ls -l ${reference} | sed -e "s/.\(...\).*/\1/" | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*/\1/" | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*/\1/" | sed -e "s/[-]//g" )
chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}
ฉันพบว่าบนหนึ่งในเครื่อง Solaris 10 ของฉันstat
ไม่พบ นั่นอาจเป็นปัญหากับการกำหนดค่าของฉัน
สิ่งนี้ใช้ได้กับฉัน:
cp -p --attributes-only <from> <to>