अन्य फ़ाइल से क्लोन स्वामित्व और अनुमतियाँ?


125

क्या उपयोगकर्ता / समूह के स्वामित्व और अनुमतियों को किसी अन्य फ़ाइल से फ़ाइल पर क्लोन करने के लिए एक कमांड या झंडा है? परमिट और स्वामित्व बनाने के लिए वास्तव में एक और फ़ाइल?

जवाबों:


175

GNU / Linux पर chownऔर chmodएक --referenceविकल्प है

chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile

1
क्या आप मेरे प्रश्न के उत्तर के रूप में इस उत्तर का संदर्भ दे सकते हैं (और इसका हवाला देते हैं): unix.stackexchange.com/questions/44253/… ? , मुझे लगता है कि मैं इसके अतिरिक्त होगा और मुझे इसके लिए वहां वोट खोजने में अच्छा लगेगा।
ग्रेज़गोरज़ वियरज़ोवेकी

@GrzegorzWierzowiecki: शायद उस सवाल को बंद कर दिया जाना चाहिए, लेकिन इससे थोड़ा अलग है और पहले से ही जवाब है, इसलिए मैं बेहतर कुछ नहीं करता हूं।
enzotib

जैसा आप चाहें और सुझाव दें। मदद के लिए धन्यवाद, मैंने कभी भी पहले और :) के --referenceपैरामीटर पर ध्यान नहीं दिया है । chmodchown
ग्रेज़गोरज़ विएर्ज़ोवेकी

12

जीएनयू उपयोगिताओं के साथ किसी भी यूनिक्स पर, जैसे (गैर-एम्बेडेड) लिनक्स या सिगविन, आप उपयोग कर सकते हैं 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

1
आपके पास एसीएल स्थापित होना चाहिए और एसीएल सक्षम के साथ फाइलसिस्टम आरोहित होना चाहिए।
enzotib

2
@enzotib कम से कम लिनक्स पर, ACL उपकरण अनुमतियों की प्रतिलिपि बनाने के लिए काम करेंगे (लेकिन स्वामित्व नहीं) भले ही स्रोत और लक्ष्य फाइल सिस्टम ACL का समर्थन न करें।
गिल्स

7

माटेओ की प्रतिक्रिया के आधार पर एक बैश कमांड किया गया :)

कोड:

chmod $( stat -f '%p' "$1" ) "${@:2}"

उपयोग:

cp-permissions <from> <to>...


5
Egad! कहना कहाँ सीखा ${*: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 और संबंधित विकल्पों के साथ) में ऐसी जानकारी होती है जो किसी ज्ञात स्थिति में फ़ाइलों को पुनर्स्थापित करने के लिए तार्किक रूप से उपयोग कर सकते हैं जैसे कि चामोद और स्पर्श। हालांकि, यह जानकारी एक प्रारूप में प्रस्तुत की जाती है जिसका उपयोग उन उपयोगिताओं या सीधे नहीं किया जा सकता है। आसानी से एक प्रारूप में अनुवादित किया जा सकता है जिसका उपयोग किया जा सकता है। ”
सिरो सेंटिल्ली 新疆 改造 iro i ''

5

यदि आप 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}

2
पार्सिंग ls -lआउटपुट के बजाय , आप आउटपुट पार्स कर सकते हैं stat
jfg956

@jfgagne: धन्यवाद समझ में आता है कि मुझे नहीं पता कि मैंने पहली बार में इसके बारे में क्यों नहीं सोचा। मैंने जवाब अपडेट किया
माटेओ

1
आप statयहाँ * BSD सिंटैक्स का उपयोग कर रहे हैं। आपका chmod $(stat ...)आदेश काम नहीं करेगा क्योंकि %pअकेले * बीएसडी के लिए बहुत अधिक जानकारी का उत्पादन करता है, केवल यू / जी / ओ बिट्स के आउटपुट का chmodउपयोग %Lpकरें। चिपचिपा / सेटुइड / सेटगिड बिट्स के लिए कुछ अधिक विस्तृत होना आवश्यक है।
mr.spuratic

0

मैं मैटो की स्क्रिप्ट में एक समायोजन जोड़ना चाहता था । लूप के लिए यह प्रमाणित करने के लिए उपयोग किया जाना चाहिए कि फाइलें वास्तव में उन पर चामोद कमांड चलाने से पहले मौजूद हैं। यह स्क्रिप्ट को और अधिक सुंदर रूप से त्रुटि देगा।

मुझे लगता है कि यह सबसे अच्छा विकल्प है क्योंकि इसका उपयोग सभी * निक्स ओएस, जैसे सोलारिस, लिनक्स, आदि के लिए किया जा सकता है।

#!/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एक पर नहीं मिला था। हालांकि मेरे विन्यास के साथ एक मुद्दा हो सकता है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.