Antworten:
Dies kann mit der folgenden Shell-Zeile erfolgen:
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
Stellen Sie einfach den richtigen Wert für die Variablen D1 und D2 ein, verweisen Sie sie auf das Quell- und das Zielverzeichnis, führen Sie den Befehl aus, und die Verzeichnisse verfügen über synchronisierte Berechtigungen.
Ich habe gerade einen neuen und einfachen Weg kennengelernt, um dies zu erreichen:
getfacl -R /path/to/source > /root/perms.acl
Dadurch wird eine Liste mit allen Berechtigungen und Eigentümern erstellt.
Gehen Sie dann zu einer Ebene über dem Ziel und stellen Sie die Berechtigungen mit wieder her
setfacl --restore=/root/perms.acl
Der Grund, warum Sie eine Ebene höher sein müssen, ist, dass alle Pfade in perms.acl relativ sind.
Sollte als root gemacht werden.
getfacl
und setfacl
nicht unbedingt auf allen Systemen vorhanden sind.
.ac
im ersten Befehl und .acl
im zweiten zu haben?
Wenn Sie die Quelle und das Ziel haben, können Sie Ihre Berechtigungen mit synchronisieren
rsync -ar --perms source/ dest
Es werden keine Daten übertragen, nur Berechtigungen ...
-r
und --perms
sind überflüssig, aber diese Synchronisation dauert immer noch, wenn sie das einzige sind, was anders ist (was Sie in der Frage gesagt haben; wenn die Bäume nicht wirklich identisch sind, sollten Sie nicht gesagt haben, dass sie identisch sind).
Sie können den Befehl find verwenden , um ein Skript mit den Befehlen zu erstellen, die Sie zum Kopieren der Berechtigungen benötigen. Hier ist ein kurzes Beispiel, mit den verschiedenen printf-Optionen können Sie noch viel mehr tun, z. B. den Eigentümer, die Gruppen-ID usw. abrufen.
$ 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
...
Zwei Wege:
(im letzteren Fall muss / dst existieren)
Edit: sorry, ich habe falsch gelesen. Nicht was du gefragt hast.
Ich denke, ich würde ein Perl-Skript schreiben, um es zu tun. So etwas wie:
#!/usr/bin/perl -nw
my $dir = $_;
my $mode = stat($dir)[2];
my $pathfix = "/some/path/to/fix/";
chmod $mode, $pathfix . $dir;
Dann mach so etwas:
cd /some/old/orig/path/ ; find . -type d | perlscript
Ich habe das auf den Kopf geschrieben und es wurde nicht getestet. Also überprüfe es, bevor du es zügellos laufen lässt. Dadurch werden nur Berechtigungen für vorhandene Verzeichnisse festgelegt. Es werden weder Berechtigungen für Dateien geändert noch fehlende Verzeichnisse erstellt.
Das habe ich mir ausgedacht:
find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh
Es ist nicht vollständig kugelsicher, tut aber, was ich brauche.