0

ファイルのリスト (ファイル/フォルダーの絶対パス) をテキスト ファイルに保存しています。あるマシンからパーミッション、user:group 属性 (これらすべてのファイルの) のみをコピーし、別のマシンの同じファイル セットに同じ設定を適用する必要があります。

私が考えることができる 1 つの方法は、あるマシンの属性をチェックし、別のマシンでファイルごとに chmod/chown を実行することによって、手動で 1 つずつ実行することですが、それは退屈な作業のようです。

これを自動化する方法のアイデアはありますか?

編集:ソースマシンではデータが異なるため、ソースマシンからのこれらのファイルのデータは必要ないことを明確にしたかっただけです。ターゲット マシンには更新されたデータが含まれています。ソース マシンから必要なのは、ファイル/フォルダーのアクセス許可とユーザー: グループだけです。

4

1 に答える 1

2

これはどう?

#!/bin/bash

user="user"
host="remote_host"

while read file
do
    permission=$(stat -c %a $file) # retrieve permission
    owner=$(stat -c %U $file) # retrieve owner
    group=$(stat -c %G $file) # retrieve group

    # just for debugging
    echo "$file@local: p = $permission, o = $owner, g = $group"

    # copy the permission
    ssh $user@$host "chmod $permission $file" < /dev/null 

    # copy both owner and group
    ssh $user@$host "chown $owner:$group $file" < /dev/null

done < list.txt

ファイルのリストは「list.txt」に保存されていると想定しています。

さらに、セットアップに応じて変数「user」と「host」を設定する必要があります。

「自動ログイン」を使用するようにsshを構成することをお勧めします。それ以外の場合は、ループごとにパスワードを 2 回挿入する必要があります。これは、パスワードなしでこの SSH ログインを行うための優れたチュートリアルです。

ssh 接続を 1 つだけ確立し、ディレクトリに再帰オプションを使用する別のソリューション (コメントで質問されているとおり) は次のとおりです。

#!/bin/bash

user="user"
host="remote_host"

cat list.txt | xargs stat -c "%n %a %U:%G" | ssh $user@$host '
while read file chmod_par chown_par 
do
    # $file contains %n
    # $chmod_par contains %a
    # $chown_par contains %U:%G

    if [ -d $file ]; then
            chmod -R $chmod_par $file
            chown -R $chown_par $file
    else
            chmod $chmod_par $file
            chown $chown_par $file  
    fi
done'
于 2013-08-24T08:19:20.343 に答える