符号链接创建了嵌套符号链接

符号链接创建了嵌套符号链接

我为另一个团队的某人编写了一个符号链接脚本,在我无权访问的目录中运行,这似乎导致了一些意外的情况。

destination_path=/path/to/dest/
source_path=/path/to/src

for dir in first second
do
    # replace existing symlink
    for subdir in {1000..1020}
    do 
        ln -sf $source_path/$dir/$subdir $destination_path/$dir/$subdir
    done
done

在脚本运行之前path/to/dest/$dir包含链接1000, 1001, ..., 1020到一组不同目录的符号链接。我的脚本旨在将这些符号链接替换为 的符号链接/path/to/src/$dir/$subdir,但它似乎没有这样做,而是在现有符号链接中创建了符号链接。

例如,/path/to/dest/$dir/1000曾经是一个符号链接,运行我的脚本后/path/to/dest/$dir/1000仍然指向同一位置,但在 内/path/to/dest/$dir/1000,有一个1000指向 的符号链接$source_path/$dir/$subdir/1000

我的脚本不应该发生这种情况,对吗?我尝试使用模拟的目标目录结构在本地重现此问题,但无法重现此问题。

编辑:经过进一步研究,我似乎应该使用ln -sfn而不是仅仅使用ln -sf?解决这个问题最简单的方法是什么?

答案1

指向目录的符号链接(几乎总是)被视为该目录。一般来说,如果您想更新符号链接,请将其删除并重新创建。

使用像这样的脚本变体,

#!/bin/bash
destination_path='/path/to/dest/'
source_path='/path/to/src'

for dir in first second
do
    # replace existing symlink
    for subdir in {1000..1020}
    do 
        s="$source_path/$dir/$subdir"
        t="$destination_path/$dir/$subdir"

        [ -d "$t" ] && [ -h "$d/$subdir" ] && echo rm -f -- "$d/$subdir"
        [ -h "$d" ] && echo rm -f -- "$d"
        echo ln -sf -- "$s" "$d"
    done
done

echo请记住,当您很高兴它会执行您需要它执行的操作时,请删除所有三个实例。

相关内容