J'essaie (aussi près que possible) de changer atomiquement un lien symbolique. J'ai essayé:
ln -sf other_dir existing_symlink
Cela vient de mettre le nouveau lien symbolique dans le répertoire vers lequel point_symlink pointé.
ln -sf other_dir new_symlink
mv -f new_symlink existing_symlink
Cela a fait la même chose: il a déplacé le lien symbolique dans le répertoire.
cp -s other_dir existing_symlink
Il refuse car c'est un répertoire.
J'ai lu que mv -T
c'était fait pour ça, mais busybox n'a pas le -T
drapeau.
ln -snf
), mais il y a toujours deux appels système sous le capot.Cela peut en effet être fait de manière atomique
rename(2)
, en créant d'abord le nouveau lien symbolique sous un nom temporaire, puis en écrasant proprement l'ancien lien symbolique en une seule fois. Comme l'indique la page de manuel :Dans le shell, vous le feriez
mv -T
comme suit:Vous pouvez
strace
utiliser cette dernière commande pour vous assurer qu'elle est bien utiliséerename(2)
sous le capot:Notez que dans ce qui précède, les deux
mv -T
etstrace
sont spécifiques à Linux.Sur FreeBSD, utilisez
mv -h
alternativement.la source
rename
directement le syscall au lieu demv -h
oumv -T
. Par exemple avec Perl:perl -e 'rename "z.new", "z" or die $!'
Reprenant là où Arto s'est arrêté ici, cela est tout à fait possible, même sans
mv -T
, il vous suffit de créer un nouveau lien symbolique avec le même nom que le répertoire cible etmv
dans le répertoire parent de votre cible:Exemple de code pris via ( http://axialcorps.wordpress.com/2013/07/03/atomically-replacing-files-and-directories/ )
la source
As-tu essayé
ln -snf
?L'option
-n
écrase la destination plutôt que d'écrire en dessous lorsque la destination est un lien symbolique vers un répertoire.À votre santé
la source
ln -snf
n'est pas atomique: il dissocie la destination, puis crée le lien symbolique souhaité.