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 mv
comando 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.mv
lugar. No veo una manera de resolver ese problema.chown
solo funciona como root.chmod
ychgrp
puede 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). Sicp
no 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.cp
implementaciones.Después de nuestra discusión sobre la primera respuesta, propongo una respuesta diferente:
Observaciones:
$original
en lamktemp
plantilla para asegurarme de que el archivo temporal no se encuentre/tmp
en la misma carpeta que en$original
. Creo que si/tmp
se monta en un sistema de archivos diferente, la operación ya no sería atómica.mktemp
ahora se cita en caso de que contenga espacios en blanco.$()
lugar de `` porque lo considero más limpio.ch{mod,own} --reference
se utilizan para transferir los permisos de$original
a$TMP
. Si alguien tiene ideas adicionales sobre qué metadatos pueden y deben transferirse, edite mi publicación y agréguela.fuente