Linux - 使用单个命令更新多个符号链接

时间:2014-02-15 20:06:34

标签: linux shell symlink

在克隆使用符号链接的环境时,会复制符号链接(从生产到克隆),但它们仍然指向原始(生产)文件。我希望他们指向克隆的文件,例如:

原件:

/production/symlink1 > /production/directory/file1
/production/foo/symlink2 > /production/directory/sub/file2

克隆(现在)之后:

/clone/symlink1 > /production/directory/file1
/clone/foo/symlink2 > /production/directory/sub/file2

我想:

/clone/symlink1 > /clone/directory/file1
/clone/foo/symlink2 > /clone/directory/sub/file2

有没有办法用一个命令来实现它?

2 个答案:

答案 0 :(得分:1)

您是否自己创建了链接?如果是,您可以使用-r参数创建它们。见man ln

  

-r, - relative

          create symbolic links relative to link location

答案 1 :(得分:1)

如果链接指向绝对路径,则复制后它们将始终指向相同的路径。这是绝对路径之美,我认为你无法解决这个问题。

您可以尝试在复制后重写这些链接。例如,如果您创建这样的脚本relink.sh

#!/bin/bash
for link; do
    target=$(readlink "$link")
    [[ $target =~ ^/production ]] || continue
    newtarget=$(echo $target | sed -e s?/production?/clone?)
    echo ln -snf "$newtarget" "$link"
done

将符号链接列表传递给此脚本,它将检查它们是否指向/production下的某个路径,并重新创建/production替换为/clone的链接。您可以这样称呼它,例如:

find /clone -type l -exec ./relink.sh {} \;