Próbuję (jak najbliżej) atomowo zmienić dowiązanie symboliczne. Próbowałem:
ln -sf other_dir existing_symlink
To po prostu umieściło nowe dowiązanie symboliczne w katalogu, który wskazywał istniejący link symboliczny.
ln -sf other_dir new_symlink
mv -f new_symlink existing_symlink
To samo zrobiło: przeniosło dowiązanie symboliczne do katalogu.
cp -s other_dir existing_symlink
Odmawia, ponieważ jest to katalog.
Przeczytałem, że mv -T
został stworzony do tego, ale busybox nie ma -T
flagi.
ln -snf
), ale pod maską są jeszcze dwa wywołania systemowe.To może być rzeczywiście wykonywane atomowo z
rename(2)
, najpierw tworzenia nowego dowiązania pod tymczasową nazwą, a następnie czysto nadpisanie starego dowiązania w jednym zamachem. Jak podaje strona podręcznika :W powłoce zrobiłbyś to
mv -T
w następujący sposób:Możesz
strace
to ostatnie polecenie, aby upewnić się, że rzeczywiście używa onorename(2)
pod maską:Zauważmy, że w powyższym zarówno
mv -T
istrace
są specyficzne dla Linuksa.Na FreeBSD używaj na
mv -h
przemian.źródło
rename
bezpośrednio korzystać z syscall zamiastmv -h
lubmv -T
. Na przykład z Perlem:perl -e 'rename "z.new", "z" or die $!'
Odbierając przerwane tutaj Arto, jest to całkowicie możliwe, nawet bez
mv -T
, wystarczy utworzyć nowe dowiązanie symboliczne o takiej samej nazwie jak katalog docelowy imv
do katalogu nadrzędnego celu:Przykład kodu wzięty przez ( http://axialcorps.wordpress.com/2013/07/03/atomically-replacing-files-and-directories/ )
źródło
Próbowałeś
ln -snf
?Opcja
-n
zastępuje miejsce docelowe, zamiast pisać pod nim, gdy miejsce docelowe jest dowiązaniem symbolicznym do katalogu.Twoje zdrowie
źródło
ln -snf
nie jest atomowy: rozłącza miejsce docelowe, a następnie tworzy pożądane dowiązanie symboliczne.