Bir dosyayı yeni bir sürümle değiştirmek için iki strateji vardır:
Yeni sürümle geçici bir dosya oluşturun, ardından yerine taşıyın.
- Avantaj: Bir program bu dosyayı açarsa, dosyayı taşımadan önce veya sonra açmasına bağlı olarak eski içeriği veya yeni içeriği okuyacaktır. Karışım yok.
- Avantajı: Bir kilitlenme durumunda eski içerik korunur.
- Dezavantajı: Yeni bir dosya oluşturulduğundan, dosyanın öznitelikleri (sahiplik, izin vb.) Korunmaz.
Eski dosyanın üzerine yazın.
- Avantajı: Dosyanın öznitelikleri korunur.
- Dezavantajı: Bir çökme durumunda, dosya yarı yazılı olarak bırakılabilir.
- Dezavantajı: Bir program güncellenirken dosyayı açıksa, bu program tutarsız verileri okuyabilir.
Yapabiliyorsanız, yöntem 1'i kullanın, ancak önce orijinal dosyanın özniteliklerini ile çoğaltın cp -p --attributes-only
. Bu, GNU coreutils (yani gömülü olmayan Linux veya yeterince Linux benzeri ortamlar) gerektirir. Sahip değilseniz cp
, --attributes-only
bu seçeneği atlayın: işe yarayacak, ancak verileri de çoğaltacaktır.
tmp=$(mktemp)
cp -p --attributes-only "$original" "$tmp"
modifyfile "$original" "$tmp"
mv -f "$tmp" "$original"
Varolan dosyanın özniteliklerini çoğaltamazsanız, örneğin üzerine yazma izniniz olduğu, ancak sahip olmadığınız ve sahibini korumak istediğiniz için, yalnızca yöntem 2 mümkündür. Veri kaybı riskini en aza indirmek için:
- Dosyanın eksik kaldığı pencereyi olabildiğince küçük hale getirin. Önce verileri geçici bir dosyada hazırlayın, sonra yerine kopyalayın.
- Önce eski dosyanın yedeğini alın.
tmp=$(mktemp)
backup="${original}~"
modifyfile "$original" "$tmp"
cp -p "$original" "$backup"
cp -f "$tmp" "$original"