Linux / Unixの同一ツリーへのアクセス許可のコピー


22

正しい権限を持つファイルのツリーがあります。その後、私は間違ったアクセス許可を持つ(ファイルごとに)同一のツリー(異なるファイルコンテンツを持つ)を持っています。

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

回答:


8

次のシェル行を使用して実行できます。

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に同期したパーミッションが付与されます。


1
これは、statが存在することを前提としています。残念ながら、コマンドstatがしばしば存在しないことがわかりました。
メイ

@David、私はそのようなシステムが統計に欠けていることを知りません。ただし、次の「8進ls」バージョンを使用し、それに応じて特定のソリューションに対応することは非常に簡単です。alias ols = "ls -la | awk '{k = 0; for(i = 0; i <= 8; i ++)k + =((substr(\ $ 1、i + 2,1)〜/ [rwx] /)* 2 ^(8-i)); if(k)printf(\ "%0o \"、k); print} ' "
drAlberT 2009

ブレークいかなる関与パスが含まれている任意の特殊文字(空白、ダッシュで始まり、など)のようなものを。
-n.st

31

これを達成するための新しい簡単な方法を学びました。

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

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

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

setfacl --restore=/root/perms.acl

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

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


これは、権限をバックアップおよび復元するための非常に簡単で簡単な方法です。ただし、すべてのシステムにgetfaclsetfaclは必ずしも存在しないことに注意してください。
the-wabbit

.ac最初のコマンドと.acl2番目のコマンドに含めるのは正しいですか?
-sfarbota

1
@sfarbota:いいえ、タイプミスでした!今修正しました。それを指摘してくれてありがとう。
-marlar

13

送信元と送信先がある場合は、アクセス許可を次のものと同期できます。 rsync -ar --perms source/ dest

データを転送するのではなく、権限だけを転送します...


1
いいえ、タイムスタンプが異なる場合はファイルをコピーします
yawniek 09

@yawniek -r--permsは冗長ですが、異なるのはそれらだけです(質問であなたが言ったことです。実際に木が同一でない場合は、それを言ってはいけません)。
クリスS

わかりませんでしたが、ツリー構造が同じであることを意味しました。
ヤウニエック

12

できることの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
...

1
findの-printf引数はGNU拡張機能であると思われますか?HP-UX findにはありません。
メイ

1
見つけるためのprintfオプションがなくても、lsオプション(または、最悪の場合はxargs ls -lへのパイプ)を使用してファイルに保存できます。1〜2分で検索と置換を行い、1つに各ファイルのchmodを含むスクリプトを作成します。
mpez0

0

二通り:

  1. UNIXのブランドで動作する場合:cp -ax / src / dest
  2. そうでない場合、これは移植可能なバージョンです:(cd / src && tar cpf-。)| (cd / dst && tar xpf-)

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

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


-a(アーカイブ用)はcpに対するGNUの追加であり、他のシステムでは見たことがありません。-dpRの略です(逆参照なし、再帰的、権限の保持)。RおよびPオプションは、CPの任意のバージョンにする必要があります
theotherreceive

0

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

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

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

それは完全な防弾ではありませんが、私が必要なことをします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.