Estou tentando (o mais próximo possível) alterar atomicamente um link simbólico. Eu tentei:
ln -sf other_dir existing_symlink
Isso acabou de colocar o novo link simbólico no diretório que o existente_symlink apontou.
ln -sf other_dir new_symlink
mv -f new_symlink existing_symlink
Isso fez a mesma coisa: moveu o link simbólico para o diretório.
cp -s other_dir existing_symlink
Recusa porque é um diretório.
Eu li que isso mv -T
foi feito para isso, mas o busybox não tem a -T
bandeira.
ln -snf
), mas ainda existem duas chamadas de sistema ocultas.Na verdade, isso pode ser feito atomicamente
rename(2)
, criando primeiro o novo link simbólico com um nome temporário e depois substituindo de maneira limpa o link simbólico antigo de uma só vez. Como a página de manual afirma:No shell, você faria isso da
mv -T
seguinte maneira:Você pode
strace
executar esse último comando para garantir que ele esteja realmente sendo usado porrename(2)
baixo do capô:Observe que, acima, ambos
mv -T
estrace
são específicos do Linux.No FreeBSD, use
mv -h
alternadamente.fonte
rename
syscall diretamente em vez demv -h
oumv -T
. Por exemplo, com Perl:perl -e 'rename "z.new", "z" or die $!'
Escolhendo de onde Arto parou aqui, isso é totalmente possível, mesmo sem
mv -T
, você só precisa criar um novo link simbólico com o mesmo nome que o diretório de destino emv
no diretório pai do seu destino:Exemplo de código obtido por meio de ( http://axialcorps.wordpress.com/2013/07/03/atomically-replacing-files-and-directories/ )
fonte
Você já tentou
ln -snf
?A opção
-n
substitui o destino em vez de escrevê-lo quando o destino é um link simbólico para um diretório.Felicidades
fonte
ln -snf
não é atômico: ele desvincula o destino e cria o link simbólico desejado.