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


125

別のファイルからファイルのユーザー/グループの所有権とアクセス許可を複製するコマンドまたはフラグはありますか?別のファイルのパーマと所有権を正確に作成するには?

回答:


175

GNU / Linux chownchmod--referenceオプションがあります

chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile

1
私の質問への答えとしてこの答えを参照してください(おそらくそれを引用してください):unix.stackexchange.com/questions/44253/…?、私は素晴らしい追加になると思うし、そのためにそこに賛成票を見つけたいです。
グジェゴシWierzowiecki

@GrzegorzWierzowiecki:おそらくその質問は閉じられるべきですが、これとは少し異なり、すでに答えがあります。
-enzotib

あなたが望むように、提案します。助けのおかげで、私は注意を入れたことがない--referenceのパラメータchmodおよびchown:)の前に。
グジェゴシWierzowiecki

12

(組み込みでない)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

1
ACLをインストールし、ACLを有効にしてファイルシステムをマウントする必要があります。
エンゾチブ

2
@enzotib少なくともLinuxでは、ソースとターゲットのファイルシステムがACLをサポートしていない場合でも、ACLツールは許可をコピーします(所有権はコピーしません)。
ジル

7

DID bashコマンドの応答に基づいてマッテオ :)

コード:

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

使用法:

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


5
エガド!どこで言うことを学びました${*:2}か?二度とそれをしないでください!いずれかのファイル名にスペース(またはタブ)が含まれている場合、失敗します。を使用し"${@:2}"ます。また、"$1"単にの代わりに使用します$1
Gマン

chmod "$(stat -c '%a' "$fromfile")" tofileGNU Coreutilsで使用--referencestatますが、CLIユーティリティはPOSIXではないため、この場合にも使用できます。pubs.opengroup.org/ onlinepubs / 9699919799 / utilities / ls.html でもls -l「カットされない」 (-lおよび関連オプションを使用)には、chmodやtouchなどのユーティリティが論理的に使用して既知の状態にファイルを復元できる情報が含まれていますが、この情報は、これらのユーティリティで直接使用できない形式で表示されるか、使用できる形式に簡単に翻訳できます。」
Ciro Santilli新疆改造中心法轮功六四事件

5

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}

2
ls -l出力を解析する代わりに、出力を解析できますstat
-jfg956

@jfgagne:おかげで理にかなっている。そもそもなぜそれについて考えなかったのかわからない。答えを更新しました
マッテオ

1
statここでは* BSD 構文を使用しています。あなただけのchmod $(stat ...)コマンドは%p* BSD's chmodにはあまりにも多くの情報を出力するので、機能しません%Lp。u/ g / oビットだけを出力するために使用します。sticky / setuid / setgidビットには、もう少し手の込んだものが必要です。
mr.spuratic

0

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見つかりませんでした。それは私の構成の問題かもしれませんが。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.