如何一次更新多个符号链接

如何一次更新多个符号链接

我最近升级了我的电脑,除了新的操作系统之外,我还有了一个新的用户名。因此,我的参考资料目录中充满了不再有效的链接,但如果我可以在链接中将我的旧用户名换成新用户名,它们就会起作用。

例如:该文件/home/CurUserName/Reference/C/Car/Insurance 指向/home/OldUserName/Reference/I/Insurance

我发现这个答案它解释了如何查找目录中的每个链接,并且我在其他地方找到了有关如何手动更新单个链接的在线说明,但我对 Bash 的经验不足,无法弄清楚如何(或是否)一次性更改所有链接。这可能吗?如果可以,怎么做?

答案1

这个问题可能应该unix/bash,但你可以这样做:

#!/bin/bash

# renl: Rename links

# Make sure we have at least two arguments, the source and destination
if [ $# -lt 2 ];then
    echo Usage: renl SOURCE DEST [TARGET]
    exit 1
else
    export SOURCE="$1"
    export DEST="$2"
fi

# Setup the target directory argument
if [ -n "$3" ]; then
    export TARGET="$3"
else
    export TARGET="."
fi

# Output the input values
echo "Source: $SOURCE"
echo "Destin: $DEST"
echo "Target: $TARGET"
echo

# Loop thru all links in the target directory
links=$(find $TARGET  -maxdepth 1  -type l)
for f in $links; do
    tolink=$(readlink "$f")

    if [[ $tolink == *"${SOURCE}"* ]]; then
        newlink=${tolink/$SOURCE/$DEST}
        echo "$f --> $tolink ==> $newlink"
        # Uncoment the next line to actaully do the rename
        # rm "$f" && ln -s "$newlink" "$f"
    else
        echo "$f --> $tolink"
    fi
done;

unset SOURCE
unset DEST
unset TARGET

请注意,如果您不想要 shell 扩展,则必须输入带有单引号的 TARGET 通配符。

相关内容