将符号链接转换为硬链接

Att*_* O. 29 bash symbolic-link find

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

for f in *; do (mv $f{,~} && ln $(readlink $f~) && rm $f~) done
Run Code Online (Sandbox Code Playgroud)

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

  • 不递归
  • 选择不是符号链接的文件

以某种方式将上述行提供给 会很好find -type l,但我不知道该怎么做。

Den*_*nis 42

此命令应该有效:

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

这个怎么运作:

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

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

    它传递{}- 当前正在处理的链接的名称 - 作为参数,bash 可以作为$0.

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

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

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

  • 我的问题是 *readlink* 默认返回一个相对路径,但 `-e` 开关修复了这个问题。 (3认同)
  • 在 Mac 上是:```brew install coreutils``` 和 ```find * -type l -exec bash -c 'ln -f "$(greadlink -m "$0")" "$0"' {} \;```。 (2认同)