GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie ändert man atomar einen Symlink zu einem Verzeichnis in busybox?

Das kann tatsächlich atomar mit rename(2) erfolgen , indem Sie zuerst den neuen Symlink unter einem temporären Namen erstellen und dann den alten Symlink in einem Rutsch sauber überschreiben. Wie es in der Manpage heißt:

Wenn neuerPfad verweist auf einen symbolischen Link wird der Link überschrieben.

In der Shell würden Sie dies mit mv -T tun wie folgt:

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

Sie können strace diesen letzten Befehl, um sicherzustellen, dass er tatsächlich rename(2) verwendet Unter der Haube:

$ 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

Beachten Sie, dass oben beide mv -T und strace sind Linux-spezifisch.

Verwenden Sie unter FreeBSD mv -h abwechselnd.


Da weitermachen, wo Arto hier aufgehört hat, ist das durchaus möglich, auch ohne mv -T , müssen Sie nur einen neuen Symlink mit demselben Namen wie das Zielverzeichnis und mv erstellen es in das übergeordnete Verzeichnis Ihres Ziels:

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

Codebeispiel genommen über (http://axialcorps.wordpress.com/2013/07/03/atomically-replacing-files-and-directories/)


Haben Sie ln -snf versucht ?

Die Option -n überschreibt das Ziel, anstatt darunter zu schreiben, wenn das Ziel ein symbolischer Link zu einem Verzeichnis ist.

Prost


Linux
  1. So aktualisieren Sie einen Linux-Symlink

  2. So ändern Sie das standardmäßige Apache-Verzeichnis „DocumentRoot“ in Linux

  3. Wie ändere ich das Stammverzeichnis eines Apache-Servers?

  4. Wie ändere ich das Startverzeichnis einer tmux-Sitzung?

  5. Wie ändert man das Home-Verzeichnis des Benutzers in Ubuntu 9.04?

So ändern Sie das Jenkins-Basisverzeichnis

So verwenden Sie den Linux-cd-Befehl zum Ändern des Verzeichnisses

Wie ändere ich Dateien oder Verzeichnisberechtigungen in cPanel?

So ändern Sie das Addon-Verzeichnis

Symlink von einer Workstation zu einer anderen ohne Mount

ldd findet keinen Pfad, wie man hinzufügt