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
调用时成功。此外,然后它会被扩展(毕竟源表单看起来可读)它不会再可读了。
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(就像现在的大多数人一样),这对您没有帮助。