有没有办法表达:`--link` 或回退到 cp 中的普通副本(来自 GNU coreutils)?

0xC*_*22L 11 hard-link cp coreutils

有没有办法告诉cp--link(即创建硬链接),但回落的情况下,我试图设备间的硬链接?设备间链接是不可能的,并且会导致cp失败。

我问的原因是因为我想在 a 中使用它,GNUmakefile并且更喜欢可读的命令行而不是一些复杂而冗长的命令行(或函数,就此而言)。

问题是针对 GNU coreutils(7.4 和 8.13)。

注意:现在的解决方法类似于(GNU make recipe 语法):

cp -fl $^ $@ || cp -f $^ $@
Run Code Online (Sandbox Code Playgroud)

这当然会在设备间链接的情况下给出虚假的错误消息,尽管在第二次cp调用时成功。此外,然后它会被扩展(毕竟源表单看起来可读)它不会再可读了。

Gil*_*il' 8

cp没有这个选项。您可以编写一个包装脚本,但这非常简单。

ln -f $^ $@ 2>/dev/null || cp -f $^ $@
Run Code Online (Sandbox Code Playgroud)

GNU Coreutils 7.5 引入了该--reflink选项。如果你通过--reflink=auto并且底层文件系统支持写时复制(例如 Btrfs 或 ZFS)并且副本恰好在同一设备上,那么cp将创建一个新的 inode 但不复制内容;否则cp执行正常复制。这仍然不是硬链接(目标始终是不同的 inode),但它可能更适合您的用例。但是,如果您使用的是不支持写时复制的 ext4(就像现在的大多数人一样),这对您没有帮助。