web-dev-qa-db-ja.com

Linux:2つのディレクトリのアクセス許可、ユーザーとグループを同期し、ファイルの内容はそのままにします

Linuxボックスには、次の2つのディレクトリがあります。

  • 間違った権限を持つ作業ファイル
  • 適切な権限(権限とユーザーおよびグループ)を持つ同じファイルの古いバージョン

ファイルの内容を変更せずに、アクセス許可のみを同期する必要があります。 rsyncを試しましたが、適切なオプションが見つかりません。アドバイスをいただけますか?

前もって感謝します。

[〜#〜]編集[〜#〜]

あなたの提案のおかげで私はこのスクリプトを持っています。サブツリーのアクセス許可を再帰的に変更します。

#!/bin/bash
cd good
find $1/* | while read DIR
do
 chown --reference="$DIR" "/bad/$DIR"
 chmod --reference="$DIR" "/bad/$DIR"
done

傑作ではありませんが、私にとってはうまくいきます。

8
Massimog

--reference=fileスイッチを使用して chmodchown の両方に切り替えて、これを行うことができます。

#!/bin/bash
for FILE  in /path/to/good/directory/*
do
    chown --reference="$FILE" /path/to/bad/directory/"$(basename "$FILE")"
    chmod --reference="$FILE" /path/to/bad/directory/"$(basename "$FILE")"
done
7
user9517

あなたはこれを試すことができます。このスクリプトに必要な2つの引数の絶対パスが必要です。このcopyperms.shsource_dirtarget_dirのように実行します

スクリプトは次のとおりです。cat copyperms.sh

#!/bin/bash

srcDir="$1"
targDir="$2"

if [ -z "$srcDir" ] || [ -z "$targDir" ]; then
    echo "Required argument missing."
Elif [ ! -d "$srcDir" ] || [ ! -d "$targDir" ] ; then
    echo "Source and target not both directories."
    exit
else
    cd $srcDir

    echo "Source directory: $srcDir; Target directory: $targDir"
    echo "Matching permissions and ownerships .."
    find . -print0 | xargs -0I {} echo {} | xargs -I {} chmod --reference "{}" "$targDir/{}"
    find . -print0 | xargs -0I {} echo {} | xargs -I {} chown --reference "{}" "$targDir/{}"
    # find . | while read name
    # do
    #   chmod --reference "$name" "$targDir/$name"
    #   chown --reference "$name" "$targDir/$name"
    # done
    echo ".. done!"
fi

コメントアウトされたwhileループを使用することで、より多くの用途に適応できますが、速度は遅くなります。

$ time mperms/adp/code/adp/safe/code

Xargsの使用:

実際の0m0.107sユーザー0m0.008ssys 0m0.004s

Whileループの使用:

実際の0m0.234sユーザー0m0.012ssys 0m0.028s sys 0m0.028s

0
Randy Skretka