फ़ाइल अनुमतियां कॉपी करें, लेकिन यूनिक्स में फाइलें नहीं


14

(प्रेषक: /programming/15245144/copy-file-permissions-but-not-files , बंद-विषय के कारण)

मेरे पास एक ही डायरेक्टरी ट्री की दो प्रतियां हैं। दोनों में लगभग एक ही फाइल है (एक संस्करण में कुछ अतिरिक्त या लापता फाइलें हो सकती हैं)। हालाँकि, अधिकांश फाइलें दोनों निर्देशिकाओं में समान हैं (समान सापेक्ष पथ और सब कुछ है)।

मान लें कि ये निर्देशिका में हैं:

version1/
version2/

समस्या यह है कि संस्करण 1 / में अनुमतियाँ गड़बड़ हो गई हैं, और मैं संस्करण 2 / से अनुमतियों की प्रतिलिपि बनाना चाहूंगा, लेकिन इसे संस्करण 1 में फ़ाइलों को प्रतिस्थापित किए बिना करें / जो नए हैं।

क्या शेल कमांड या स्क्रिप्ट के माध्यम से ऐसा करने का कोई स्वचालित तरीका है?


यहाँ पर्ल में एक उपयोगी स्क्रिप्ट है जिसे आप serverfault.com/questions/373058/… का
NoNoNo

जवाबों:



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

मेरे मामले में मैंने "स्क्रिप्ट" के साथ "स्टेट" कमांड का उपयोग करके हल किया और अनुमतियों को लागू करने वाली स्क्रिप्ट बनाने के लिए "vi"।

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

"Vi" में मैंने "chmod" कमांड की सभी पंक्तियों को सम्मिलित किया: %s/^/chmod /g मैंने स्क्रिप्ट को version2/निर्देशिका में कॉपी किया और उसे निष्पादित किया।

अन्य समाधान मान्य प्रतीत होते हैं लेकिन मैं मामले में उनका परीक्षण नहीं करता।


0

मारियानो पनिगा के जवाब से प्रेरित होकर, मुझे लगता है कि मेरे पास एक बेहतर है, जिसे 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


क्या आपकी स्क्रिप्ट एम्बेडेड नाम के साथ नाम संभालती है?
डियर हंटर

@ हिरण-शिकारी के रूप में यह काम करना चाहिए, यदि नहीं, तो आप फ़ाइल नाम भाग के आसपास एक उद्धरण ".." जोड़ सकते हैं।
टॉमफुमी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.