लिनक्स / यूनिक्स पर समान पेड़ के लिए अनुमतियों की प्रतिलिपि बनाएँ


22

मेरे पास सही अनुमति वाली फाइलों का एक पेड़ है। फिर मेरे पास गलत अनुमतियों के साथ एक (फ़िलेविज़) समान वृक्ष (विभिन्न फ़ाइल सामग्री के साथ कठिन) है।

मैं एक पेड़ से दूसरे में अनुमतियों के लेआउट को कैसे स्थानांतरित कर सकता हूं?

जवाबों:


8

यह निम्नलिखित शेल लाइन के साथ किया जा सकता है:

D1=foo; D2=foo2; for entry in $(find $D1  -exec stat -f "%N:%Mp%Lp" {} \;); do $(echo $entry | sed 's#'$D1'#'$D2'#' | awk -F: '{printf ("chmod %s %s\n", $2, $1)}') ; done

बस डी 1 और डी 2 चर के लिए सही मूल्य निर्धारित करें, उन्हें स्रोत और गंतव्य निर्देशिकाओं के लिए इंगित करें, चलाएं और डायर को सिंक में अनुमति होगी।


1
यह मानता है कि मूर्ति मौजूद है। मैंने पाया है, अफसोस की बात है, कि कमांड स्टेट अक्सर मौजूद नहीं होता है।
मेई

@ डेविड, मुझे ऐसी किसी प्रणाली की जानकारी नहीं है, जिसमें स्टैट की कमी है। लेकिन निम्नलिखित "ऑक्टल ls" संस्करण का उपयोग करना और उसके अनुसार दिए गए समाधान को समायोजित करना काफी तुच्छ है: अलियास ओलस = "ls -la | awk '{k = 0; के लिए (i = 0; i <= 8; i + ++; k + +; = (पदार्थ (\ $ 1, i + 2,1) ~ / [rwx] /) * 2 ^ (8-i); यदि (के) प्रिंटफ (\ "% 0o \", के); प्रिंट} '; "
drAlberT

जब कोई भी पथ शामिल होता है तो किसी भी प्रकार का विशेष वर्ण (व्हाट्सएप, डैश, आदि) से शुरू होता है।
एनटी।

31

मैंने इसे पूरा करने का एक नया और सरल तरीका सीखा है:

getfacl -R /path/to/source > /root/perms.acl

यह सभी अनुमतियों और मालिकों के साथ एक सूची उत्पन्न करेगा।

फिर गंतव्य के ऊपर एक स्तर पर जाएं और अनुमतियों को पुनर्स्थापित करें

setfacl --restore=/root/perms.acl

आपके पास एक स्तर ऊपर होने का कारण यह है कि perms.acl में सभी पथ सापेक्ष हैं।

जड़ के रूप में किया जाना चाहिए।


यह बैकअप के लिए एक बहुत ही सरल और सरल तरीका है और अनुमतियों को बहाल करना है। हालांकि कि नोट getfaclऔर setfaclजरूरी सभी सिस्टम पर मौजूद नहीं हैं।
wabbit

क्या .acपहले कमांड .aclमें और दूसरे में रखना सही है ?
sfarbota

1
@sfarbota: नहीं, यह एक टाइपो था! अब ठीक हो गया। इस पर ध्यान दिलाने के लिए धन्यवाद।
marlar

13

यदि आपके पास स्रोत और भाग्य है, तो आप अपनी अनुमतियों के साथ सिंक्रनाइज़ कर सकते हैं rsync -ar --perms source/ dest

यह डेटा को स्थानांतरित नहीं करेगा, बस अनुमति ...


1
नहीं, यह फाइलों की नकल करेगा अगर टाइमस्टैम्प अलग
yawniek

@yawniek -rऔर --permsबेमानी हैं, लेकिन यह अभी भी सिंक करता है यदि वे केवल एक चीज है जो अलग है (जो आपने प्रश्न में कहा है; यदि पेड़ वास्तव में समान नहीं हैं तो आपको यह नहीं कहना चाहिए कि वे थे)।
क्रिस एस

ठीक है, मैं स्पष्ट नहीं था, मेरा मतलब था कि पेड़-संरचना समान है।
यवनीक

12

एक बात तुम कर सकते हो का उपयोग करें खोजने के आदेश आदेशों आपको अनुमति नकल करने की जरूरत के साथ एक स्क्रिप्ट बनाने के लिए। यहां एक त्वरित उदाहरण है, आप विभिन्न प्रिंटफ विकल्पों के साथ बहुत कुछ कर सकते हैं, जिसमें मालिक, समूह आईडी और इसी तरह शामिल हैं।

$ find /var/log -type d -printf "chmod %m %p \n" > reset_perms
$ cat reset_perms
chmod 755 /var/log
chmod 755 /var/log/apt
chmod 750 /var/log/apache2
chmod 755 /var/log/fsck
chmod 755 /var/log/gdm
chmod 755 /var/log/cups
chmod 2750 /var/log/exim4
...

1
मुझे संदेह है कि -प्रिंटफ तर्क जीएनयू एक्सटेंशन है? HP-UX के पास यह नहीं है।
मेई

1
यहां तक ​​कि प्रिंटफ विकल्प को खोजने के बिना, कोई भी एलएस विकल्प का उपयोग कर सकता है (या, सबसे खराब, पाइप से एक्सएआरजीएस एलएस-एल) और एक फ़ाइल में सहेजें। एक या दो मिनट की खोज और प्रतिस्थापित, और प्रत्येक फ़ाइल के लिए एक स्क्रिप्ट होगी जिसमें चामोद होगा।
mpez0

0

दो तरीके:

  1. यदि यह आपके UNIX के ब्रांड पर काम करता है: cp -ax / src / dest
  2. या यदि नहीं, तो यह पोर्टेबल संस्करण है: (cd / src && tar cpf -।) | (cd / dst && tar xpf -)

(बाद के मामले में / dst मौजूद होना चाहिए)

संपादित करें: क्षमा करें, मैं गलत हूं। आपने जो मांगा नहीं।


यह उल्लेखनीय है कि -a (संग्रह के लिए) cp के लिए एक GNU है, मैंने इसे कभी किसी अन्य सिस्टम पर नहीं देखा है। यह केवल -dpR (कोई डी-संदर्भ, पुनरावर्ती, संरक्षित अनुमतियाँ) के लिए छोटा है। R और p विकल्प cp के किसी भी संस्करण में होना चाहिए
Theotherreceive

0

मुझे लगता है कि मैं इसे करने के लिए एक पर्ल स्क्रिप्ट लिखूंगा। कुछ इस तरह:

#!/usr/bin/perl -nw

my $dir = $_;
my $mode = stat($dir)[2];
my $pathfix = "/some/path/to/fix/";
chmod $mode, $pathfix . $dir;

फिर कुछ इस तरह से करें:

cd /some/old/orig/path/ ; find . -type d | perlscript

मैंने इसे अपने सिर के ऊपर से लिखा है, और इसका परीक्षण नहीं किया गया है; इससे पहले कि आप इसे बड़े पैमाने पर चलाने दें, इसे जांचें। यह केवल मौजूद निर्देशिकाओं पर अनुमतियाँ ठीक करता है; यह फाइलों पर अनुमति नहीं बदलेगा, न ही यह अनुपलब्ध निर्देशिका बनाएगा।


0

मैं इसके साथ आया:

find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh

यह पूरी तरह से बुलेट प्रूफ नहीं है, लेकिन मुझे इसकी आवश्यकता है।

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