回答:
GNU / Linux chownにchmodは--referenceオプションがあります
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
--referenceのパラメータchmodおよびchown:)の前に。
(組み込みでない)LinuxやCygwinなどのGNUユーティリティを備えたUNIXでは、chmod --referenceandchown --referenceを使用できます。
システムにACLがある場合は、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
コード:
chmod $( stat -f '%p' "$1" ) "${@:2}"
使用法:
cp-permissions <from> <to>...
${*:2}か?二度とそれをしないでください!いずれかのファイル名にスペース(またはタブ)が含まれている場合、失敗します。を使用し"${@:2}"ます。また、"$1"単にの代わりに使用します$1。
chmod "$(stat -c '%a' "$fromfile")" tofileGNU Coreutilsで使用--referenceしstatますが、CLIユーティリティはPOSIXではないため、この場合にも使用できます。pubs.opengroup.org/ onlinepubs / 9699919799 / utilities / ls.html でもls -l「カットされない」 (-lおよび関連オプションを使用)には、chmodやtouchなどのユーティリティが論理的に使用して既知の状態にファイルを復元できる情報が含まれていますが、この情報は、これらのユーティリティで直接使用できない形式で表示されるか、使用できる形式に簡単に翻訳できます。」
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}
ls -l出力を解析する代わりに、出力を解析できますstat。
statここでは* BSD 構文を使用しています。あなただけのchmod $(stat ...)コマンドは%p* BSD's chmodにはあまりにも多くの情報を出力するので、機能しません%Lp。u/ g / oビットだけを出力するために使用します。sticky / setuid / setgidビットには、もう少し手の込んだものが必要です。
Matteoのスクリプトに調整を加えたいと思いました。実際にchmodコマンドを実行する前に、ファイルが存在することを検証するためにforループを使用する必要があります。これにより、スクリプトエラーがより優雅に出力されます。
これは、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見つかりませんでした。それは私の構成の問題かもしれませんが。
これは私のために働く:
cp -p --attributes-only <from> <to>