递归地重新链接所有多跳符号链接以直接链接到最终目的地

递归地重新链接所有多跳符号链接以直接链接到最终目的地

如何递归地删除中间人链接?例如:

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

相关内容