जवाबों:
GNU / Linux पर chown
और chmod
एक --reference
विकल्प है
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
--reference
पैरामीटर पर ध्यान नहीं दिया है । chmod
chown
जीएनयू उपयोगिताओं के साथ किसी भी यूनिक्स पर, जैसे (गैर-एम्बेडेड) लिनक्स या सिगविन, आप उपयोग कर सकते हैं chmod --reference
औरchown --reference
।
यदि आपके सिस्टम में ACL हैं , तो 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
माटेओ की प्रतिक्रिया के आधार पर एक बैश कमांड किया गया :)
कोड:
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.htmlthat यह भी कहेगा ls -l
: "ls का आउटपुट (-l और संबंधित विकल्पों के साथ) में ऐसी जानकारी होती है जो किसी ज्ञात स्थिति में फ़ाइलों को पुनर्स्थापित करने के लिए तार्किक रूप से उपयोग कर सकते हैं जैसे कि चामोद और स्पर्श। हालांकि, यह जानकारी एक प्रारूप में प्रस्तुत की जाती है जिसका उपयोग उन उपयोगिताओं या सीधे नहीं किया जा सकता है। आसानी से एक प्रारूप में अनुवादित किया जा सकता है जिसका उपयोग किया जा सकता है। ”
यदि आप GNU के chmod / chown के साथ एक प्रणाली का उपयोग नहीं कर रहे हैं (जो --reference
विकल्प का समर्थन करते हैं ) तो आप आउटपुट को पार्स करने का प्रयास कर सकते हैंls -l
यहाँ के लिए एक छोटी सी स्क्रिप्ट chmod
(यदि आपके पास एक ऐसा दृश्य है जो विस्तारित रेगेक्स का समर्थन करता है तो उन्हें बहुत अधिक पठनीय तरीके से लिखा जा सकता है ...)
#!/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
अकेले * बीएसडी के लिए बहुत अधिक जानकारी का उत्पादन करता है, केवल यू / जी / ओ बिट्स के आउटपुट का chmod
उपयोग %Lp
करें। चिपचिपा / सेटुइड / सेटगिड बिट्स के लिए कुछ अधिक विस्तृत होना आवश्यक है।
मैं मैटो की स्क्रिप्ट में एक समायोजन जोड़ना चाहता था । लूप के लिए यह प्रमाणित करने के लिए उपयोग किया जाना चाहिए कि फाइलें वास्तव में उन पर चामोद कमांड चलाने से पहले मौजूद हैं। यह स्क्रिप्ट को और अधिक सुंदर रूप से त्रुटि देगा।
मुझे लगता है कि यह सबसे अच्छा विकल्प है क्योंकि इसका उपयोग सभी * निक्स ओएस, जैसे सोलारिस, लिनक्स, आदि के लिए किया जा सकता है।
#!/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}
मैंने पाया कि मेरी सोलारिस 10 मशीनों में से stat
एक पर नहीं मिला था। हालांकि मेरे विन्यास के साथ एक मुद्दा हो सकता है।
यह मेरे लिए काम करता है:
cp -p --attributes-only <from> <to>