ファイルを新しいバージョンで置き換えるには、2つの方法があります。
新しいバージョンで一時ファイルを作成し、適切な場所に移動します。
- 利点:プログラムがそのファイルを開く場合、移動の前または後にファイルを開いたかどうかに応じて、古いコンテンツまたは新しいコンテンツを読み取ります。取り違えはありません。
- 利点:クラッシュした場合、古いコンテンツが保持されます。
- 欠点:新しいファイルが作成されるため、ファイルの属性(所有権、権限など)は保持されません。
古いファイルを上書きします。
- 利点:ファイルの属性が保持されます。
- 欠点:クラッシュした場合、ファイルが半分書き込まれたままになることがあります。
- 欠点:更新中にプログラムがファイルを開いていると、このプログラムは矛盾したデータを読み取る可能性があります。
可能であれば、方法1を使用しますが、最初に元のファイルの属性をで複製しますcp -p --attributes-only
。これには、GNU coreutils(つまり、非組み込みLinux、または十分にLinuxに似た環境)が必要です。cp
がない場合は--attributes-only
、このオプションを省略します。機能しますが、データも複製されます。
tmp=$(mktemp)
cp -p --attributes-only "$original" "$tmp"
modifyfile "$original" "$tmp"
mv -f "$tmp" "$original"
既存のファイルの属性をレプリケートできない場合(たとえば、ファイルへの書き込み権限はあるが所有しておらず、所有者を保持したい場合)は、方法2のみが可能です。データ損失のリスクを最小限に抑えるには:
- ファイルが不完全になるウィンドウをできるだけ小さくします。最初に一時ファイルでデータを準備してから、所定の場所にコピーします。
- 最初に古いファイルのバックアップを作成します。
tmp=$(mktemp)
backup="${original}~"
modifyfile "$original" "$tmp"
cp -p "$original" "$backup"
cp -f "$tmp" "$original"