Hay dos estrategias para reemplazar un archivo por una nueva versión:
Cree un archivo temporal con la nueva versión, luego muévalo a su lugar.
- Ventaja: si un programa abre ese archivo, leerá el contenido anterior o el nuevo contenido, dependiendo de si abrió el archivo antes o después del movimiento. No hay confusión.
- Ventaja: en caso de bloqueo, se conserva el contenido antiguo.
- Desventaja: dado que se crea un nuevo archivo, los atributos del archivo (propiedad, permiso, etc.) no se conservan.
Sobrescriba el archivo antiguo en su lugar.
- Ventaja: se preservan los atributos del archivo.
- Desventaja: en caso de accidente, el archivo puede dejarse medio escrito.
- Desventaja: si un programa tiene el archivo abierto cuando se está actualizando, este programa puede leer datos inconsistentes.
Si puede, use el método 1, pero primero replique los atributos del archivo original con cp -p --attributes-only
. Esto requiere GNU coreutils (es decir, Linux no incrustado o entornos suficientemente similares a Linux). Si cp
no tiene --attributes-only
, omita esta opción: funcionará pero también replicará los datos.
tmp=$(mktemp)
cp -p --attributes-only "$original" "$tmp"
modifyfile "$original" "$tmp"
mv -f "$tmp" "$original"
Si no puede replicar los atributos del archivo existente, por ejemplo, porque tiene permisos de escritura pero no lo posee y desea conservar el propietario, entonces solo es posible el método 2. Para minimizar el riesgo de pérdida de datos:
- Haga que la ventana durante la cual el archivo estará incompleto sea lo más pequeña posible. Prepare los datos primero en un archivo temporal, luego cópielos en su lugar.
- Haga una copia de seguridad del archivo anterior primero.
tmp=$(mktemp)
backup="${original}~"
modifyfile "$original" "$tmp"
cp -p "$original" "$backup"
cp -f "$tmp" "$original"