Tengo un comando que acepta un archivo como argumento, modifica el archivo y luego lo escribe con el nombre de archivo especificado en el segundo argumento. Llamaré a ese programa modifyfile.
Quería que funcionara "en su lugar", así que escribí un script de shell (bash) que lo modifica a un archivo temporal y luego lo mueve hacia atrás:
TMP=`mktemp`
modifyfile "$original" "$TMP"
mv -v "$TMP" "$original"
Esto tiene el desafortunado efecto secundario de destruir los permisos en este archivo. El archivo se vuelve a crear con permisos predeterminados.
¿Hay alguna manera de decirle al mvcomando que sobrescriba el destino sin alterar sus permisos? O, alternativamente, ¿hay alguna manera de guardar el usuario, el grupo y los permisos del original y restaurarlos?
fuente

rm "$TMP", pero parece hacer exactamente lo que quiero.mvlugar. No veo una manera de resolver ese problema.chownsolo funciona como root.chmodychgrppuede o no funcionar dependiendo de los permisos del usuario. Ninguno copia otros atributos como ACL o atributos extendidos específicos del sistema de archivos.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.
Sobrescriba el archivo antiguo en su lugar.
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). Sicpno tiene--attributes-only, omita esta opción: funcionará pero también replicará los datos.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:
fuente
cp -p --attributes-only "$original" "$tmp"no utilizará recursos para copiar el contenido del archivo. No pude encontrar de qué versión se agregó este argumento.cpimplementaciones.Después de nuestra discusión sobre la primera respuesta, propongo una respuesta diferente:
Observaciones:
$originalen lamktempplantilla para asegurarme de que el archivo temporal no se encuentre/tmpen la misma carpeta que en$original. Creo que si/tmpse monta en un sistema de archivos diferente, la operación ya no sería atómica.mktempahora se cita en caso de que contenga espacios en blanco.$()lugar de `` porque lo considero más limpio.ch{mod,own} --referencese utilizan para transferir los permisos de$originala$TMP. Si alguien tiene ideas adicionales sobre qué metadatos pueden y deben transferirse, edite mi publicación y agréguela.fuente