使用文本编辑器编辑符号链接是否可行?

19

当我们创建符号链接时,符号链接所占用的字节数恰好等于它指向的原始文件名长度。例如,

$ ln -s dest link1
$ ln -s longer_dest link2
$ ls -l
lrwxrwxrwx 1 username  4 Mar 26 20:21 link1 -> dest
lrwxrwxrwx 1 username 11 Mar 26 20:21 link2 -> longer_dest

其中link1占用4个字节,这是dest的长度;link2占用11个字节,这是longer_dest的长度。因此,符号链接实际上只是以纯文本形式存储的目标路径。因此,我想知道是否可以在文本编辑器(最好是Emacs)中编辑符号链接的目标。我谷歌了一下,但没有找到任何人谈论这个问题。请注意,这个问题完全是出于好奇,我非常清楚可以使用ln -f -s覆盖符号链接


5
对于那些投票关闭的人,我认为这是一个有效且清晰陈述的问题;虽然它不是直接与编程有关,但它对程序员很有趣,而且这类问题在这里非常多——只需查看相关问题即可。 - 4ae1e1
4个回答

6

原则上是可能的,但编辑器需要专门支持它,因为读取符号链接的目标需要一个特殊的系统调用:readlink()

你不太可能找到任何实际执行此操作的编辑器,因为它并不是很有用,并且与大多数用户希望编辑器在打开符号链接时所做的相冲突:打开它所指向的文件。


谢谢,这听起来很合理。我已经投了赞成票,但还不会立即接受。 - 4ae1e1

6

是的,在Emacs中,这在dired-mode下是可能的,具体来说是wdired(可写入的dired)模式。

请注意,dired和wdired都是内置包。

下面是一个例子...

wdired editing a symlink

顺便说一下:我正在使用Smex来为Emacs提供M-x命令搜索和执行更人性化的UI +模糊匹配。


在dired中,按下C-x C-q进入wdired模式。在dired缓冲区中进行所需更改。然后按下C-c C-c以应用更改。 - dat
顺便提一下,由于“S-w”未绑定(Shift+w),我在“dired-mode-map”中使用它来启动“wdired-change-to-wdired-mode”。 “C-x C-s”也保存在“wdired-mode”中所做的更改,这对你的肌肉记忆更容易些。 - ocodo

2
根据维基百科符号链接中的“符号链接存储”部分,符号链接存储在一个inode中。这个inode是一个包含有关所讨论的文件的几个信息的数据结构-根据this threadtouch命令可用于更改其中一些值。因此,由于@Wyzard提到的问题,可能无法使用文本编辑器修改它,但可以使用其他命令行工具(如touch)进行修改。

希望这可以帮助您!


2

正如其他人所指出的那样,直接更改不可能,但你可以编写一个脚本。以下是我在必须更改大量符号链接时想出来的一个脚本。

#! /bin/bash

tmp=$(mktemp)
trap "rm $tmp" EXIT

while [ ! -z "$1" ]; do
    filename="$1"; shift
    if [ ! -h "$filename" ]; then
        echo "Not a symlink: $filename";
        continue
    fi
    stat -c "%N" "$filename" >> $tmp
done
emacs $tmp

while read filename linkname; do
    ln -sf "$linkname" "$filename"
done < <(sed "s/'\(.*\)' -> '\(.*\)'/\1 \2/" $tmp)

这对我有用,但肯定不完美,因此使用时需自行承担风险...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接