将符号链接转换为硬链接


25

我想将软链接递归转换为目录中的硬链接。我已经尝试过这样的事情:

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

…但是它有两个主要问题:

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

最好以某种方式将上面的行输入到find -type l,但是我不确定如何做到这一点。


1
另请参见[此讨论] [1](cp -aH)。[1]:unix.stackexchange.com/questions/94185/...
迈克尔Shigorin

Answers:


34

此命令应该起作用:

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将显示错误消息。


关于最后一段,指定到bash和的绝对路径是否足够ln
丹尼尔·贝克

2
我的问题是,默认情况下,readlink返回一个相对路径,但是-e开关可以解决该问题。
丹尼斯

OSX的命令是什么?
伊戈尔·马尔科洛夫

@IgorMarkelov对不起,但是关于OSX我一无所知。
丹尼斯

1
在Mac上是:brew install coreutilsfind * -type l -exec bash -c 'ln -f "$(greadlink -m "$0")" "$0"' {} \;
伊戈尔·马尔科洛夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.