Yanıtlar:
Aşağıdaki kabuk çizgisiyle yapılabilir:
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
basitçe D1 ve D2 değişkenleri için doğru değeri ayarlayın, bunları kaynak ve hedef dizinlere yönlendirin, çalıştırın ve dirs senkronize izinlere sahip olacaktır.
Bunu başarmanın yeni ve basit bir yolunu öğrendim:
getfacl -R /path/to/source > /root/perms.acl
Bu, tüm izin ve sahipliklere sahip bir liste oluşturur.
Ardından hedefin üzerindeki bir seviyeye gidin ve izinleri geri yükleyin.
setfacl --restore=/root/perms.acl
Yukarıda bir seviye olmanızın nedeni, perms.acl içindeki tüm yolların göreceli olmasıdır.
Kök olarak yapılmalı.
getfacl
ve setfacl
tüm sistemlerde mutlaka bulunmaz.
.ac
İlk komutta ve .acl
ikincide olmak doğru mu?
Kaynağa ve desteye sahipseniz, izinlerinizi senkronize edebilirsiniz.
rsync -ar --perms source/ dest
Verileri aktarmayacak, sadece izinleri ...
-r
ve --perms
gereksiz, ancak bu yine de farklı olan tek şeyse izin verir (eğer Soru'da söylediğiniz şey; ağaçlar gerçekte özdeş değilse, öyle olduklarını söylememeliydiniz).
Yapabileceğiniz bir şey , izinleri kopyalamanız için gereken komutları içeren bir komut dosyası oluşturmak için find komutunu kullanmaktır . İşte hızlı bir örnek, sahibi, grup kimliğini vb. Dahil olmak üzere çeşitli printf seçenekleriyle daha fazlasını yapabilirsiniz.
$ 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
...
İki yol:
(İkinci durumda / dst mevcut olmalıdır)
Düzenleme: üzgünüm, yanlış okudum. İstediğin gibi değil.
Sanırım bunu yapmak için bir perl betiği yazardım. Gibi bir şey:
#!/usr/bin/perl -nw
my $dir = $_;
my $mode = stat($dir)[2];
my $pathfix = "/some/path/to/fix/";
chmod $mode, $pathfix . $dir;
O zaman şöyle bir şey yap:
cd /some/old/orig/path/ ; find . -type d | perlscript
Bunu başımın üstünden yazdım ve test edilmedi; Bu yüzden, hiddetli çalışmasına izin vermeden önce kontrol edin. Bu yalnızca var olan dizinlerdeki izinleri düzeltir; dosyalar üzerindeki izinleri değiştirmeyecek, eksik dizinler yaratamayacak.
Bununla geldim:
find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh
Tamamen kurşun geçirmez değil, ihtiyacım olanı yapıyor.