別のファイルからユーザー/グループの所有権とファイルの権限を複製するコマンドまたはフラグはありますか?権限と所有権を別のファイルのものと完全に一致させるには?
GNU/Linuxでは、chown
およびchmod
には--reference
オプション
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
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
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}
これは私にとってはうまくいきます:
cp -p --attributes-only <from> <to>
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
が見つからないことがわかりました。それは私の設定の問題かもしれません。