GNU/Linux >> Linux の 問題 >  >> Linux

シンボリックリンクをビジーボックスのディレクトリにアトミックに変更するにはどうすればよいですか?

これはできます 確かに rename(2) でアトミックに行われます 、最初に一時的な名前で新しいシンボリックリンクを作成し、次に古いシンボリックリンクを一度にきれいに上書きします。マニュアルページに記載されているとおり:

<ブロック引用>

If 新しいパス 上書きされるシンボリック リンクを参照します。

シェルでは、これを mv -T で行います 次のように:

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

straceできます 実際に rename(2) を使用していることを確認する最後のコマンド ボンネットの下:

$ 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

上記では、両方とも mv -T であることに注意してください。 および strace Linux 固有のものです。

FreeBSD では、mv -h を使用します


Arto がここで中断したところから始めると、mv -T がなくても、これは完全に可能です。 、ターゲット ディレクトリと同じ名前で mv の新しいシンボリック リンクを作成するだけです。 ターゲットの親ディレクトリに追加します:

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

(http://axialcorps.wordpress.com/2013/07/03/atomically-replacing-files-and-directories/) で取得したコード例


ln -snf を試しましたか ?

オプション -n 宛先がディレクトリへのシンボリック リンクである場合、宛先の下に書き込むのではなく、宛先を上書きします。

乾杯


Linux
  1. Apache サーバーのルート ディレクトリを変更するにはどうすればよいですか?

  2. ディレクトリ内のすべてのファイルで単語のすべての出現を変更する方法

  3. tmux セッションの開始ディレクトリを変更するには?

  1. Ubuntu 9.04 でユーザーのホーム ディレクトリを変更するにはどうすればよいですか?

  2. gnome-terminals の起動ディレクトリを変更するには?

  3. ldd でパスが見つからない、追加方法

  1. Linuxシンボリックリンクを更新する方法

  2. LinuxでデフォルトのApache「DocumentRoot」ディレクトリを変更する方法

  3. Linuxでカスタムホームディレクトリを使用してユーザーを作成する方法