将符号链接转换为硬链接

将符号链接转换为硬链接

我想递归地将目录中的软链接转换为硬链接。我尝试过类似这样的方法:

for f in *; do (mv $f{,~} && ln $(readlink $f~) && rm $f~) done

…但它有两个主要问题:

  • 非递归
  • 拾取非符号链接的文件

如果能以某种方式将上面的行提供给就好了find -type l,但我不确定如何做到这一点。

答案1

该命令应该可以工作:

find -type l -exec bash -c 'ln -f "$(readlink -m "$0")" "$0"' {} \;

怎么运行的:

  • find -type l查找当前目录中的所有链接。

  • -exec bash -c '...' {} \;调用 bash 来执行...

    它传递{}当前正在处理的链接的名称作为参数,bash 可以将其作为 来访问$0

  • readlink -m "$0"返回符号链接目标的绝对路径。

  • ln -f "$(readlink -m "$0")" "$0"使用指向目标的硬链接覆盖(-f)符号链接。$0

如果由于某种原因无法转换链接,它将保持不变并且 ln 将打印一条错误消息。

相关内容