GNU/Linux >> Znalost Linux >  >> Linux

Jak lze atomicky změnit symbolický odkaz na adresář v busyboxu?

Toto může skutečně být provedeno atomicky pomocí rename(2) , a to tak, že nejprve vytvoříte nový symbolický odkaz pod dočasným názvem a poté jedním tahem čistě přepíšete starý symbolický odkaz. Jak uvádí manuálová stránka:

Pokud nová cesta odkazuje na symbolický odkaz, odkaz bude přepsán.

V shellu byste to udělali pomocí mv -T takto:

$ mkdir a b
$ ln -s a z
$ ln -s b z.new
$ mv -T z.new z

Můžete strace poslední příkaz, aby se ujistil, že skutečně používá rename(2) pod kapotou:

$ 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

Všimněte si, že ve výše uvedeném jsou oba mv -T a strace jsou specifické pro Linux.

Na FreeBSD použijte mv -h střídavě.


Pokračujeme tam, kde Arto skončil, je to zcela možné, dokonce i bez mv -T , stačí vytvořit nový symbolický odkaz se stejným názvem jako cílový adresář a mv do nadřazeného adresáře vašeho cíle:

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 ./

Příklad kódu převzatý přes (http://axialcorps.wordpress.com/2013/07/03/atomically-replacing-files-and-directories/)


Zkusili jste ln -snf ?

Možnost -n přepíše cíl místo toho, aby pod něj zapisoval, když je cílem symbolický odkaz na adresář.

Na zdraví


Linux
  1. Jak změnit všechny výskyty slova ve všech souborech v adresáři

  2. Jak změnit počáteční adresář relace tmux?

  3. Jak lze změnit domovský adresář uživatele v Ubuntu 9.04?

  1. Jak změnit spouštěcí adresář gnome-terminals?

  2. Jak lze identifikovat používané linuxové distro?

  3. ldd nenajde cestu, Jak přidat

  1. Jak aktualizovat symbolický odkaz pro Linux

  2. Jak změnit výchozí adresář Apache 'DocumentRoot' v Linuxu

  3. Jak vytvořit uživatele s vlastním domovským adresářem v Linuxu