Réponses:
Cela peut être fait avec la ligne de shell suivante:
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
définissez simplement la bonne valeur pour les variables D1 et D2, pointez-les vers les répertoires source et de destination, exécutez et les répertoires auront des autorisations synchronisées.
Je viens d'apprendre une façon nouvelle et simple d'accomplir cela:
getfacl -R /path/to/source > /root/perms.acl
Cela générera une liste avec toutes les autorisations et propriétés.
Ensuite, allez à un niveau au - dessus de la destination et restaurez les autorisations avec
setfacl --restore=/root/perms.acl
La raison pour laquelle vous devez être un niveau au-dessus est que tous les chemins d'accès dans perms.acl sont relatifs.
Doit être fait en tant que root.
getfacl
et setfacl
ne sont pas nécessairement présents sur tous les systèmes.
.ac
dans la première commande et .acl
dans la seconde?
Si vous avez la source et la destination, vous pouvez synchroniser vos autorisations avec
rsync -ar --perms source/ dest
Il ne transférera pas les données, juste des autorisations ...
-r
et --perms
sont redondants, mais cela permet toujours de synchroniser s'ils sont la seule chose qui est différente (c'est ce que vous avez dit dans la question; si les arbres ne sont pas réellement identiques, vous n'auriez pas dû dire qu'ils l'étaient).
Une chose que vous pourriez faire est d'utiliser la commande find pour créer un script avec les commandes dont vous avez besoin pour copier les autorisations. Voici un exemple rapide, vous pourriez faire beaucoup plus avec les différentes options de printf, y compris obtenir le propriétaire, l'ID de groupe, etc.
$ 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
...
Deux voies:
(dans ce dernier cas / dst doit exister)
Edit: désolé, j'ai mal lu. Pas ce que tu as demandé.
Je pense que j'écrirais un script perl pour le faire. Quelque chose comme:
#!/usr/bin/perl -nw
my $dir = $_;
my $mode = stat($dir)[2];
my $pathfix = "/some/path/to/fix/";
chmod $mode, $pathfix . $dir;
Ensuite, faites quelque chose comme ceci:
cd /some/old/orig/path/ ; find . -type d | perlscript
J'ai écrit cela du haut de ma tête, et cela n'a pas été testé; alors vérifiez-le avant de le laisser courir. Cela corrige uniquement les autorisations sur les répertoires existants; il ne modifiera pas les autorisations sur les fichiers, ni ne créera de répertoires manquants.
Je suis venu avec ceci:
find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh
Ce n'est pas totalement à l'épreuve des balles, mais fait ce dont j'ai besoin.