我想递归地将目录中的软链接转换为硬链接。我尝试过类似这样的方法:
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 将打印一条错误消息。