जवाबों:
GNU / Linux पर chownऔर chmodएक --referenceविकल्प है
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
--referenceपैरामीटर पर ध्यान नहीं दिया है । chmodchown
जीएनयू उपयोगिताओं के साथ किसी भी यूनिक्स पर, जैसे (गैर-एम्बेडेड) लिनक्स या सिगविन, आप उपयोग कर सकते हैं 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")" tofileGNU Coreutils में, लेकिन आप --referenceउस स्थिति में भी उपयोग कर सकते हैं क्योंकि statCLI उपयोगिता 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>