Esta puede de hecho hacerse atómicamente con 02
, creando primero el nuevo enlace simbólico con un nombre temporal y luego sobrescribiendo limpiamente el antiguo enlace simbólico de una sola vez. Como dice la página del manual:
Si nueva ruta hace referencia a un enlace simbólico, el enlace se sobrescribirá.
En el shell, harías esto con 10
de la siguiente manera:
$ mkdir a b
$ ln -s a z
$ ln -s b z.new
$ mv -T z.new z
Puedes 35
bajo el capó:
$ strace mv -T z.new z
lstat64("z.new", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
lstat64("z", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
rename("z.new", "z") = 0
Tenga en cuenta que en lo anterior, tanto 42
y 52
son específicos de Linux.
En FreeBSD, use 69
alternativamente.
Retomando donde lo dejó Arto aquí, esto es completamente posible, incluso sin 76
, solo necesita crear un nuevo enlace simbólico con el mismo nombre que el directorio de destino y 82
en el directorio principal de su objetivo:
mkdir -p tmp/real_dir1 tmp/real_dir2
touch tmp/real_dir1/a tmp/real_dir2/a
# start with ./target_dir pointing to tmp/real_dir1
ln -s tmp/real_dir1 target_dir
# create a symlink named target_dir in tmp, pointing to real_dir2
ln -sf tmp/real_dir2 tmp/target_dir
# atomically mv it into ./ replacing ./target_dir
mv tmp/target_dir ./
Ejemplo de código tomado a través de (http://axialcorps.wordpress.com/2013/07/03/atomically-replacing-files-and-directories/)
¿Has probado 96
? ?
La opción 108
sobrescribe el destino en lugar de escribir debajo de él cuando el destino es un enlace simbólico a un directorio.
Saludos