Có hai chiến lược để thay thế một tệp bằng một phiên bản mới:
Tạo một tệp tạm thời với phiên bản mới, sau đó di chuyển nó vào vị trí.
- Ưu điểm: nếu một chương trình mở tệp đó, nó sẽ đọc nội dung cũ hoặc nội dung mới, tùy thuộc vào việc nó mở tệp trước hay sau khi di chuyển. Không có trộn lẫn.
- Ưu điểm: trong trường hợp sự cố, nội dung cũ được bảo tồn.
- Nhược điểm: do một tệp mới được tạo, các thuộc tính của tệp (quyền sở hữu, quyền, v.v.) không được giữ nguyên.
Ghi đè tập tin cũ vào vị trí.
- Ưu điểm: thuộc tính của tệp được bảo tồn.
- Nhược điểm: trong trường hợp có sự cố, tập tin có thể được viết nửa vời.
- Nhược điểm: nếu một chương trình mở tệp khi nó đang được cập nhật, chương trình này có thể đọc dữ liệu không nhất quán.
Nếu bạn có thể, hãy sử dụng phương thức 1, nhưng trước tiên hãy sao chép các thuộc tính của tệp gốc bằng cp -p --attributes-only
. Điều này đòi hỏi GNU coreutils (tức là Linux không nhúng hoặc các môi trường giống như Linux). Nếu bạn cp
không có --attributes-only
, hãy bỏ qua tùy chọn này: nó sẽ hoạt động nhưng nó cũng sẽ sao chép dữ liệu.
tmp=$(mktemp)
cp -p --attributes-only "$original" "$tmp"
modifyfile "$original" "$tmp"
mv -f "$tmp" "$original"
Nếu bạn không thể sao chép các thuộc tính của tệp hiện có, ví dụ vì bạn có quyền ghi trên nó nhưng không sở hữu nó và bạn muốn giữ nguyên chủ sở hữu, thì chỉ có phương pháp 2 là có thể. Để giảm thiểu rủi ro mất dữ liệu:
- Tạo cửa sổ trong đó tệp sẽ không đầy đủ càng nhỏ càng tốt. Chuẩn bị dữ liệu đầu tiên trong một tệp tạm thời, sau đó sao chép nó vào vị trí.
- Tạo một bản sao lưu của tập tin cũ đầu tiên.
tmp=$(mktemp)
backup="${original}~"
modifyfile "$original" "$tmp"
cp -p "$original" "$backup"
cp -f "$tmp" "$original"