【问题标题】:Is it possible to edit a symlink with a text editor?是否可以使用文本编辑器编辑符号链接?
【发布时间】:2014-03-27 03:29:50
【问题描述】:

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

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

【问题讨论】:

  • 对于那些投票接近的人,我相信这是一个有效的、明确陈述的问题;虽然它与编程没有直接关系,但它对程序员很感兴趣,而且这里有很多这类问题——只要看看相关问题就行了。

标签: linux shell unix symlink


【解决方案1】:

是的,在 Emacs 中,这在 dired 模式下是可能的,特别是 wdired(可写 dired)模式。

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

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

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

【讨论】:

  • 如何做到这一点的文本版本:一旦进入 dired,C-x C-q 进入 wdired 模式。在 dired 缓冲区中进行所需的更改。然后C-c C-c 应用更改。
  • 顺便说一句,因为S-w 未绑定(shift w)我在dired-mode-map 中使用它来启动wdired-change-to-wdired-modeC-x C-s 还保存了在 wdired-mode 中所做的更改,这对你的肌肉记忆更容易。
【解决方案2】:

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

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

【讨论】:

  • 谢谢,这听起来很合理。我投了赞成票,但还不接受。
【解决方案3】:

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

我希望这会有所帮助!

【讨论】:

    【解决方案4】:

    正如其他人已经指出的那样,直接不可能,但是您当然可以为其编写脚本。这是我不得不更改大量符号链接时想到的一个

    #! /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)
    

    它对我有用,但它肯定不是完美的,所以使用风险自负......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-16
      • 2013-04-27
      • 1970-01-01
      • 2013-12-23
      相关资源
      最近更新 更多