2014-03-27 53 views
9

当我们创建一个符号链接时,符号链接占用的字节数就是它指向的路径的长度。例如,是否可以使用文本编辑器编辑符号链接?

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

+1

**对于那些谁投赞成票关闭**,我相信这是一个有效的,明确提出的问题;虽然它不是直接与编程相关的,但它对程序员很感兴趣,再加上这里有很多这样的问题 - 只要看看相关的问题即可。 – 4ae1e1

回答

4

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

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

+0

谢谢,这听起来很合理。我投了票,但不会接受。 – 4ae1e1

1

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

我希望这有助于!

1

这是不可能的,正如其他人已经指出的那样,但是当然你可以为它编写一个脚本。这里有一个我想出了的时候,我不得不改变很多符号链接

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

它为我工作的,但它肯定不是完美的,所以你要自己承担风险使用...

相关问题