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

时间:2014-03-27 03:29:50

标签: linux shell unix symlink

当我们创建符号链接时,符号链接占用的字节数正是它指向的原点的长度。例如,

$ 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 覆盖符号链接。

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

是的,在Emacs中,这可以在dired-mode,特别是wdired(可写的dired)模式下进行。

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

这是一个例子......

wdired editing a symlink

(顺便说一句:我正在使用Smex为Emacs M-x命令搜索&执行更符合人体工程学的UI +模糊匹配)

答案 2 :(得分:2)

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

我希望这有帮助!

答案 3 :(得分: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)

它对我有用,但它肯定不完美,所以请自担风险......