web-dev-qa-db-ja.com

Linux / UNIXで同一のツリーに権限をコピーする

正しい権限を持つファイルのツリーがあります。それから私は(ファイルごとに)同じツリー(異なるファイル内容が難しい)を持っていますが、間違った権限があります。

アクセス許可のレイアウトをツリー間で転送するにはどうすればよいですか?

22
yawniek

これは、次のシェル行で実行できます。

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は同期したアクセス許可を持つことになります。

8
drAlberT

私はこれを達成するための新しく簡単な方法を学びました:

getfacl -R /path/to/source > /root/perms.acl

これにより、すべての権限と所有権を含むリストが生成されます。

次に、1つのレベルに移動above宛先を指定して、権限を復元します

setfacl --restore=/root/perms.acl

1つ上のレベルにする必要があるのは、perms.aclのすべてのパスが相対パスであるためです。

ルートとして実行する必要があります。

31
marlar

ソースと宛先がある場合は、rsync -ar --perms source/ destと権限を同期できます

データは転送されず、権限のみが転送されます...

13
Dom

実行できることの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
...
12
Zoredache

私はこれを思いつきました:

find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh

完全に防弾ではありませんが、必要なことを行います。

0
Ikem Krueger

二つの方法:

  1. ご使用のUNIXブランドで機能する場合:cp -ax/src/dest
  2. または、そうでない場合、これはポータブルバージョンです:(cd/src && tar cpf-。)| (cd/dst && tar xpf-)

(後者の場合、/ dstが存在している必要があります)

編集:申し訳ありませんが、私は誤解しています。あなたが尋ねたものではありません。

0
Thomas

私はそれを行う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

私はこれを頭のてっぺんから書きましたが、テストされていません。横行する前に確認してください。これは、存在するディレクトリの権限のみを修正します。ファイルのアクセス許可を変更することも、不足しているディレクトリを作成することもありません。

0
Mei