回答:
GNU / Linux chown
にchmod
は--reference
オプションがあります
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
--reference
のパラメータchmod
およびchown
:)の前に。
(組み込みでない)LinuxやCygwinなどのGNUユーティリティを備えたUNIXでは、chmod --reference
andchown --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")" tofile
GNU 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>