一度のアトミック操作でファイルを移動し、元の所有者(グループ)とファイルモードを保存する方法はありますか?それでは、元の所有者やスキーマを設定しなくても、他の人が移動したファイルにタイムリーにアクセスできませんか?
ファイルシステムはXFSです。
答え1
同じファイルシステムを使用してファイルを移動する場合、これはmv
アトミック操作です。。ある程度、ファイルは前の場所にあります。その後、ファイルは新しい場所になります。古いディレクトリのファイルエントリを削除し、新しいディレクトリに新しいエントリを追加するには、1回の操作しか必要ありません。エントリはファイルの内容だけでなく、ファイル全体です。インデックスノード、所有者、権限などのファイルメタデータを含みます。権限はいつでも変更できません。
ファイルを別のファイルシステムに移動する場合、それで作業はアトミックではありません。つまり、新しいファイルを作成してから古いファイルと一致するまで、その内容とメタデータを変更して古いファイルを削除することが含まれます。作成された新しいファイルは常に空で、そのファイルを作成したユーザーに属します。作成者はファイルが作成された直後に既存のUnix権限を設定できますが、アクセス制御リストは設定できません。
mv
umask
必要な所有者とグループとして実行し、ファイル権限補完を設定して、新しいファイルの初期所有者、グループ、およびモードを制御できます。以下は、ユーザーとグループが存在し、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
答え2
現在の要件は、mv
同じファイルシステム内のファイルまたはファイルツリーで動作することです。
これは原子性と所有権/グループの要件を満たします。操作がユーザーとして実行されると、root
setgidフラグと固定ビットフラグも保持されます。通常のファイルとディレクトリの場合、すべてのユーザーが移動できます。もしソースおよびターゲットの親ディレクトリに対する読み取り+書き込み+実行権限があります(例:old
このnew
例では)。
mv /path/to/old/source /path/to/new/destination
バラよりPOSIXMVそしてPOSIXの名前変更正確な詳細を得るには
答え3
これを行うにはいくつかの方法があります。原子的ではありませんが、必要に応じて十分に安全でなければなりません。
権限と所有権を維持するために、タグを使用してファイルをコピーして
-p
から元のファイルを削除できます。cp -p /old/path/file /new/path/ && rm -f /old/path/file
rsyncを使用できます。
rsync -pogXA --remove-source-files /old/path/file /new/path/
ルートの場合は、
chmod 000
ファイルを移動して適切な所有者と権限を復元できます。