你可以改变一个符号链接创build后指向什么?

任何操作系统是否提供了一种机制(系统调用 – 不是命令行程序)来更改由符号链接(符号链接)引用的path名 – 除了断开旧链接并创build一个新链接?

POSIX标准没有。 Solaris 10不。 MacOS X 10.5(豹)不。 (我可以肯定,无论是AIX还是HP-UX都不是这样,从这个Linux系统调用列表来看,Linux也没有这样的系统调用。)

有什么事吗?

(我期待答案是“不”)。


既然certificate一个否定是很难的,那么我们来重新组织这个问题。

如果您知道尚未列出的一些(类似Unix的)操作系统在没有删除旧符号链接并创build新符号链接的情况下没有系统调用重写symlink( readlink()返回的stringreadlink()的值,请添加它 -或者他们 – 在一个答案。

AFAIK,不,你不能。 你必须删除它并重新创build它。 实际上,你可以覆盖一个符号链接,从而更新它引用的path名:

 $ ln -s .bashrc test $ ls -al test lrwxrwxrwx 1 pascal pascal 7 2009-09-23 17:12 test -> .bashrc $ ln -s .profile test ln: creating symbolic link `test': File exists $ ln -s -f .profile test $ ls -al test lrwxrwxrwx 1 pascal pascal 8 2009-09-23 17:12 test -> .profile 

编辑 :正如OP在注释中指出的那样,使用--force选项将使得在执行symlink()之前的系统调用unlink() symlink() 。 下面,我的Linux机箱上strace的输出certificate了这一点:

 $ strace -o /tmp/output.txt ln -s -f .bash_aliases test $ grep -C3 ^unlink /tmp/output.txt lstat64("test", {st_mode=S_IFLNK|0777, st_size=7, ...}) = 0 stat64(".bash_aliases", {st_mode=S_IFREG|0644, st_size=2043, ...}) = 0 symlink(".bash_aliases", "test") = -1 EEXIST (File exists) unlink("test") = 0 symlink(".bash_aliases", "test") = 0 close(0) = 0 close(1) = 0 

所以我想最后的答案是“不”。

编辑 :以下是从Artix Bendiken的答案在unix.stackexchange.com,大约2016年复制。

这实际上可以通过rename(2)primefaces级地完成,首先在临时名称下创build新的符号链接,然后一口气完全覆盖旧的符号链接。 正如手册页所述:

如果newpath引用一个符号链接,链接将被覆盖。

在shell中,你可以使用mv -T来做到这一点,如下所示:

 $ mkdir ab $ ln -saz $ ln -sb z.new $ mv -T z.new z 

你可以把最后一个命令弄清楚,确保它确实使用了下面的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 -Tstrace都是Linux专用的。

在FreeBSD上,交替使用mv -h

编者按:这就是卡皮斯特拉诺已经做了多年,现在是2.15。 看到这个拉请求 。

是的你可以!

 $ ln -sfn source_file_or_directory_name softlink_name 

没有必要明确地断开旧的符号链接。 你可以这样做:

 ln -s newtarget temp mv temp mylink 

(或使用等效的符号链接和重命名调用)。 这比明确地取消链接更好,因为重命名是primefaces的,所以你可以放心,链接将始终指向旧的或新的目标。 但是这不会重用原始的inode。

在某些文件系统上,如果足够短,则符号链接的目标将存储在inode本身(代替阻止列表)中; 这是在创build时确定的。

关于实际的所有者和组织是不重要的断言,Linux上的符号链接(7)表示存在一个重要的情况:

现有符号链接的所有者和组可以使用lchown(2)进行更改。 符号链接的所有权唯一的一个问题是链接被删除或重命名在粘滞位设置的目录(请参阅stat(2))。

符号链接的上次访问和上次修改时间戳可以使用utimensat(2)或lutimes(3)来更改。

在Linux上,任何操作都不使用符号链接的权限。 权限始终为0777(对所有用户类别都是读取,写入和执行),并且不能更改。

无论如何,不​​要断开它,创造新的东西,也会做同样的事情呢?

只是警告以上正确的答案:

如果混用源代码和目标代码,使用-f / –force方法会造成丢失文件的风险:

 mbucher@server2:~/test$ ls -la total 11448 drwxr-xr-x 2 mbucher www-data 4096 May 25 15:27 . drwxr-xr-x 18 mbucher www-data 4096 May 25 15:13 .. -rw-r--r-- 1 mbucher www-data 4109466 May 25 15:26 data.tar.gz -rw-r--r-- 1 mbucher www-data 7582480 May 25 15:27 otherdata.tar.gz lrwxrwxrwx 1 mbucher www-data 11 May 25 15:26 thesymlink -> data.tar.gz mbucher@server2:~/test$ mbucher@server2:~/test$ ln -s -f thesymlink otherdata.tar.gz mbucher@server2:~/test$ mbucher@server2:~/test$ ls -la total 4028 drwxr-xr-x 2 mbucher www-data 4096 May 25 15:28 . drwxr-xr-x 18 mbucher www-data 4096 May 25 15:13 .. -rw-r--r-- 1 mbucher www-data 4109466 May 25 15:26 data.tar.gz lrwxrwxrwx 1 mbucher www-data 10 May 25 15:28 otherdata.tar.gz -> thesymlink lrwxrwxrwx 1 mbucher www-data 11 May 25 15:26 thesymlink -> data.tar.gz 

当然这是有意的,但通常会发生错误。 因此,删除和重build符号链接是一个更多的工作,但也有点节约:

 mbucher@server2:~/test$ rm thesymlink && ln -s thesymlink otherdata.tar.gz ln: creating symbolic link `otherdata.tar.gz': File exists 

至less保留我的文件。

以防万一它有帮助:有一种方法来编辑与午夜指挥官(MC)的符号链接。 菜单命令是(在我的MC界面法语):

 Fichier / Éditer le lien symbolique 

可能被翻译成:

 File / Edit symbolic link 

快捷键是Cx Cs

也许它在内部使用ln --force命令,我不知道。

现在,我试图find一种方法来一次编辑大量的符号链接(这是我到达这里)。