1つのアトミック操作でファイルを移動し、所有者とモードを維持します。

1つのアトミック操作でファイルを移動し、所有者とモードを維持します。

一度のアトミック操作でファイルを移動し、元の所有者(グループ)とファイルモードを保存する方法はありますか?それでは、元の所有者やスキーマを設定しなくても、他の人が移動したファイルにタイムリーにアクセスできませんか?

ファイルシステムはXFSです。

ベストアンサー1

同じファイルシステムを使用してファイルを移動する場合、これはmvアトミック操作です。。ある程度、ファイルは前の場所にあります。その後、ファイルは新しい場所になります。古いディレクトリのファイルエントリを削除し、新しいディレクトリに新しいエントリを追加するには、1回の操作しか必要ありません。エントリはファイルの内容だけでなく、ファイル全体です。インデックスノード、所有者、権限などのファイルメタデータを含みます。権限はいつでも変更できません。

ファイルを別のファイルシステムに移動する場合、それで作業はアトミックではありません。つまり、新しいファイルを作成してから古いファイルと一致するまで、その内容とメタデータを変更して古いファイルを削除することが含まれます。作成された新しいファイルは常に空で、そのファイルを作成したユーザーに属します。作成者はファイルが作成された直後に既存のUnix権限を設定できますが、アクセス制御リストは設定できません。

mvumask必要な所有者とグループとして実行し、ファイル権限補完を設定して、新しいファイルの初期所有者、グループ、およびモードを制御できます。以下は、ユーザーとグループが存在し、Bourneスタイルのシェルをログインシェルとして使用していると仮定するLinuxシェルアプローチです。

set $(stat -c '%U %G %a' "$original_file")
export user=$1 group=$2 mode=0$3 original_file destination
su "$user" -c 'sg "$group" -c "umask $((07777 & ~mode)) && touch "$destination" && mv -- "$original_file" "$destination"'

これは非常に退屈で、正しい所有権と権限を持っていますが、コンテンツ、タイムスタンプなどが異なるファイルを生成します。ファイルが完全にコピーされるまで表示されないようにするには、まずルートにのみ表示されるターゲットファイルシステムの一時ディレクトリにファイルを移動し、ファイルをアトミックにその場所に移動します。

d=$(TMPDIR="$(dirname -- "${destination}")" mktemp -d)
chmod 700 "$d"
mv -- "$original" "$d/file"
mv -- "$d/file" "$destination"
rmdir d

おすすめ記事