回答:
次のシェル行を使用して実行できます。
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
D1変数とD2変数に適切な値を設定し、それらをソースディレクトリと宛先ディレクトリにポイントし、実行するだけで、dirsに同期したパーミッションが付与されます。
これを達成するための新しい簡単な方法を学びました。
getfacl -R /path/to/source > /root/perms.acl
これにより、すべての権限と所有権を含むリストが生成されます。
次に、宛先の1つ上のレベルに移動して、権限を復元します
setfacl --restore=/root/perms.acl
1つ上のレベルにする必要があるのは、perms.aclのすべてのパスが相対パスであるためです。
ルートとして実行する必要があります。
getfacl
とsetfacl
は必ずしも存在しないことに注意してください。
.ac
最初のコマンドと.acl
2番目のコマンドに含めるのは正しいですか?
送信元と送信先がある場合は、アクセス許可を次のものと同期できます。
rsync -ar --perms source/ dest
データを転送するのではなく、権限だけを転送します...
-r
と--perms
は冗長ですが、異なるのはそれらだけです(質問であなたが言ったことです。実際に木が同一でない場合は、それを言ってはいけません)。
できることの1つは、findコマンドを使用して、アクセス許可をコピーするために必要なコマンドを含むスクリプトを作成することです。以下に簡単な例を示します。所有者やグループIDの取得など、さまざまなprintfオプションを使用してさらに多くのことができます。
$ 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が存在する必要があります)
編集:申し訳ありませんが、私は誤解しています。あなたが尋ねたものではありません。
私はそれを行うためにperlスクリプトを書くと思います。何かのようなもの:
#!/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
私はこれを頭の外に書きましたが、テストされていません。横行する前に確認してください。これは、存在するディレクトリの権限のみを修正します。ファイルの権限を変更したり、欠落しているディレクトリを作成したりすることはありません。