我为另一个团队的某人编写了一个符号链接脚本,在我无权访问的目录中运行,这似乎导致了一些意外的情况。
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
请记住,当您很高兴它会执行您需要它执行的操作时,请删除所有三个实例。