Ada dua strategi untuk mengganti file dengan versi baru:
Buat file sementara dengan versi baru, lalu pindahkan ke tempatnya.
- Keuntungan: jika suatu program membuka file itu, itu akan membaca konten lama atau konten baru, tergantung pada apakah itu membuka file sebelum atau setelah pindah. Tidak ada campur aduk.
- Keuntungan: jika terjadi kerusakan, konten lama dipertahankan.
- Kelemahan: karena file baru dibuat, atribut file (kepemilikan, izin, dll.) Tidak dipertahankan.
Timpa file lama di tempatnya.
- Keuntungan: atribut file dipertahankan.
- Kelemahan: jika terjadi kerusakan, file mungkin dibiarkan setengah ditulis.
- Kelemahan: jika suatu program membuka file ketika sedang diperbarui, program ini mungkin membaca data yang tidak konsisten.
Jika Anda bisa, gunakan metode 1, tetapi pertama-tama salin atribut dengan file asli cp -p --attributes-only
. Ini membutuhkan GNU coreutils (yaitu Linux yang tidak tertanam, atau lingkungan yang cukup seperti Linux). Jika Anda cp
tidak memilikinya --attributes-only
, abaikan opsi ini: itu akan berfungsi tetapi itu akan mereplikasi data juga.
tmp=$(mktemp)
cp -p --attributes-only "$original" "$tmp"
modifyfile "$original" "$tmp"
mv -f "$tmp" "$original"
Jika Anda tidak dapat mereplikasi atribut dari file yang ada, misalnya karena Anda memiliki izin tulis tetapi tidak memilikinya dan Anda ingin mempertahankan pemiliknya, maka hanya metode 2 yang memungkinkan. Untuk meminimalkan risiko kehilangan data:
- Buatlah jendela di mana file tersebut tidak lengkap sekecil mungkin. Siapkan data terlebih dahulu dalam file sementara, lalu salin ke tempatnya.
- Buat cadangan file lama terlebih dahulu.
tmp=$(mktemp)
backup="${original}~"
modifyfile "$original" "$tmp"
cp -p "$original" "$backup"
cp -f "$tmp" "$original"