web-dev-qa-db-ja.com

別のファイルから所有権と権限を複製しますか?

別のファイルからユーザー/グループの所有権とファイルの権限を複製するコマンドまたはフラグはありますか?権限と所有権を別のファイルのものと完全に一致させるには?

132
user394

GNU/Linuxでは、chownおよびchmodには--referenceオプション

chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
185
enzotib

GNU(組み込みでない)LinuxやCygwinなどのユーティリティ)を使用するUNIXでは、 chmod --referenceおよびchown --reference を使用できます。

システムに ACLs がある場合は、ACLコマンドgetfaclおよびsetfaclを試してください。これらのコマンドはシステムによって少し異なりますが、多くの場合、getfacl other_file | setfacl -bnM - file_to_changeを使用して権限をコピーできます。これは所有権をコピーしません。空白を含むユーザー名またはグループ名がない場合は、ls -l other_fileを注意深く解析することでそれを行うことができます。

LC_ALL=C ls -l other_file | {
  read -r permissions links user group stuff;
  chown -- "$user:$group" file_to_change
}
getfacl other_file | setfacl -bnM - file_to_change

Matteo :)の応答に基づいて bashコマンド を実行しました

コード:

chmod $( stat -f '%p' "$1" ) "${@:2}"

用途:

cp-permissions <from> <to>...

8
mjlescano

GNUのchmod/chown(--referenceオプションをサポート)を備えたシステムを使用していない場合は、ls -lの出力を解析してみてください。

ここにchmodの小さなスクリプトがあります(拡張正規表現をサポートしているものがあれば、もっと読みやすい方法で記述できます...)

#!/bin/sh

reference=$1
shift
files=$*

# strip the permissions (whith extended regexes could be more readable)
OWNER=$(ls -l ${reference} | sed -e "s/.\(...\).*/\1/"       | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*/\1/"    | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*/\1/" | sed -e "s/[-]//g" )

chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}

[〜#〜]更新[〜#〜]

これはstatを使用するとさらに簡単です:

chmod $( stat -f '%p' ${reference} ) ${files}
5
Matteo

これは私にとってはうまくいきます:

cp -p --attributes-only <from> <to>

0
user172554

Matteo のスクリプトに調整を加えたかった。 forループを使用して、ファイルに対して実際にchmodコマンドを実行する前に、ファイルが存在することを検証する必要があります。これにより、スクリプトエラーがより適切に出力されます。

Solaris、Linuxなどのすべての* nix OSで使用できるため、これが最良のオプションだと思います。

#!/bin/sh

reference=$1
shift
files=$*

for file in $reference $files; do
  [ -f $file ] || { echo "$file does not exist"; exit 1; }
done

# strip the permissions (whith extended regexes could be more readable)
OWNER=$(ls -l ${reference} | sed -e "s/.\(...\).*/\1/" | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*/\1/" | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*/\1/" | sed -e "s/[-]//g" )

chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}

Solaris 10マシンの1つでstatが見つからないことがわかりました。それは私の設定の問題かもしれません。

0
David