Estoy intentando (lo más cerca posible) cambiar atómicamente un enlace simbólico. He intentado:
ln -sf other_dir existing_symlink
Eso solo puso el nuevo enlace simbólico en el directorio al que apuntaba el enlace simbólico existente.
ln -sf other_dir new_symlink
mv -f new_symlink existing_symlink
Eso hizo lo mismo: movió el enlace simbólico al directorio.
cp -s other_dir existing_symlink
Se niega porque es un directorio.
He leído que mv -T
se hizo para esto, pero busybox no tiene la -T
bandera.
ln -snf
), pero todavía hay dos llamadas al sistema bajo el capó.De hecho, esto se puede hacer atómicamente
rename(2)
, primero creando el nuevo enlace simbólico con un nombre temporal y luego sobrescribiendo limpiamente el enlace simbólico anterior de una vez. Como dice la página del manual :En el shell, haría esto de la
mv -T
siguiente manera:Puede
strace
usar ese último comando para asegurarse de que realmente se está utilizandorename(2)
debajo del capó:Tenga en cuenta que en lo anterior, ambos
mv -T
ystrace
son específicos de Linux.En FreeBSD, use
mv -h
alternativamente.fuente
rename
llamada al sistema directamente en lugar demv -h
omv -T
. Por ejemplo con Perl:perl -e 'rename "z.new", "z" or die $!'
Retomando donde dejó Arto aquí, esto es completamente posible, incluso sin
mv -T
eso, solo necesita crear un nuevo enlace simbólico con el mismo nombre que el directorio de destino ymv
en el directorio principal de su objetivo:Ejemplo de código tomado a través de ( http://axialcorps.wordpress.com/2013/07/03/atomically-replacing-files-and-directories/ )
fuente
¿Lo has intentado
ln -snf
?La opción
-n
sobrescribe el destino en lugar de escribir debajo de él cuando el destino es un enlace simbólico a un directorio.Salud
fuente
ln -snf
no es atómico: desvincula el destino y luego crea el enlace simbólico deseado.