जवाबों:
यह निम्नलिखित शेल लाइन के साथ किया जा सकता है:
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 चर के लिए सही मूल्य निर्धारित करें, उन्हें स्रोत और गंतव्य निर्देशिकाओं के लिए इंगित करें, चलाएं और डायर को सिंक में अनुमति होगी।
मैंने इसे पूरा करने का एक नया और सरल तरीका सीखा है:
getfacl -R /path/to/source > /root/perms.acl
यह सभी अनुमतियों और मालिकों के साथ एक सूची उत्पन्न करेगा।
फिर गंतव्य के ऊपर एक स्तर पर जाएं और अनुमतियों को पुनर्स्थापित करें
setfacl --restore=/root/perms.acl
आपके पास एक स्तर ऊपर होने का कारण यह है कि perms.acl में सभी पथ सापेक्ष हैं।
जड़ के रूप में किया जाना चाहिए।
getfacl
और setfacl
जरूरी सभी सिस्टम पर मौजूद नहीं हैं।
.ac
पहले कमांड .acl
में और दूसरे में रखना सही है ?
यदि आपके पास स्रोत और भाग्य है, तो आप अपनी अनुमतियों के साथ सिंक्रनाइज़ कर सकते हैं
rsync -ar --perms source/ dest
यह डेटा को स्थानांतरित नहीं करेगा, बस अनुमति ...
-r
और --perms
बेमानी हैं, लेकिन यह अभी भी सिंक करता है यदि वे केवल एक चीज है जो अलग है (जो आपने प्रश्न में कहा है; यदि पेड़ वास्तव में समान नहीं हैं तो आपको यह नहीं कहना चाहिए कि वे थे)।
एक बात तुम कर सकते हो का उपयोग करें खोजने के आदेश आदेशों आपको अनुमति नकल करने की जरूरत के साथ एक स्क्रिप्ट बनाने के लिए। यहां एक त्वरित उदाहरण है, आप विभिन्न प्रिंटफ विकल्पों के साथ बहुत कुछ कर सकते हैं, जिसमें मालिक, समूह आईडी और इसी तरह शामिल हैं।
$ 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
...
दो तरीके:
(बाद के मामले में / dst मौजूद होना चाहिए)
संपादित करें: क्षमा करें, मैं गलत हूं। आपने जो मांगा नहीं।
मुझे लगता है कि मैं इसे करने के लिए एक पर्ल स्क्रिप्ट लिखूंगा। कुछ इस तरह:
#!/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
मैंने इसे अपने सिर के ऊपर से लिखा है, और इसका परीक्षण नहीं किया गया है; इससे पहले कि आप इसे बड़े पैमाने पर चलाने दें, इसे जांचें। यह केवल मौजूद निर्देशिकाओं पर अनुमतियाँ ठीक करता है; यह फाइलों पर अनुमति नहीं बदलेगा, न ही यह अनुपलब्ध निर्देशिका बनाएगा।
मैं इसके साथ आया:
find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh
यह पूरी तरह से बुलेट प्रूफ नहीं है, लेकिन मुझे इसकी आवश्यकता है।