如何递归地删除中间人链接?例如:
somelink -> someintermediarylink -> actualfile.txt
会成为
somelink -> actualfile.txt
对于目录及其子目录中的所有文件(即递归)
有想法吗?
答案1
使用 GNU 工具:
find . -type l ! -xtype l -exec sh -c '
for link do
target=$(readlink -e -- "$link") &&
ln -svTf -r -- "$target" "$link"
done' sh {} +
将所有未损坏的符号链接更改为相对的,并且目标中没有符号链接组件。
-r
如果您希望拥有绝对符号链接,请删除。
假设这些符号链接指向的文件的规范绝对名称都不以换行符结尾(命令替换的通常限制是删除所有尾随换行符)。
答案2
#!/bin/bash
# Usage: ./relinkToFinalDestination directory_path
directory=$1
find -L $directory -xtype l | while read file; do
next_hop=$(readlink "$file")
if [[ -e $next_hop ]]; then
final=$(readlink -e "$file")
echo "Got final path for $file --> $final"
# Update the link
ln -sf "$final" "$file"
fi
done