![有没有办法表达: `--link` 或回退到 cp 中的普通副本(来自 GNU coreutils)?](https://linux22.com/image/28607/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E8%A1%A8%E8%BE%BE%EF%BC%9A%20%60--link%60%20%E6%88%96%E5%9B%9E%E9%80%80%E5%88%B0%20cp%20%E4%B8%AD%E7%9A%84%E6%99%AE%E9%80%9A%E5%89%AF%E6%9C%AC%EF%BC%88%E6%9D%A5%E8%87%AA%20GNU%20coreutils%EF%BC%89%EF%BC%9F.png)
有没有办法告诉cp
(--link
即创建硬链接),但在我尝试设备间硬链接的情况下回退?设备间链接是不可能的,并且会导致cp
失败。
我问的原因是因为我想在 a 中使用它GNUmakefile
,并且更喜欢可读的命令行而不是一些复杂而冗长的命令行(或函数,就此而言)。
问题是针对 GNU coreutils(7.4 和 8.13)的。
注意:现在的解决方法类似于(GNU make Recipe 语法):
cp -fl $^ $@ || cp -f $^ $@
当然,在设备间链接的情况下,这会给出虚假的错误消息,尽管第二次cp
调用会成功。另外,然后它会被扩展(毕竟源形式看起来可读),它不会再太可读了。
答案1
cp
没有这个选项。您可以编写一个包装脚本,但这非常简单。
ln -f $^ $@ 2>/dev/null || cp -f $^ $@
GNU Coreutils 7.5 引入了该--reflink
选项。如果你通过--reflink=auto
并且底层文件系统支持写时复制(例如Btrfs或ZFS)并且副本恰好位于同一设备上,那么cp
将创建一个新的inode但不复制内容;否则cp
执行正常复制。这仍然不是硬链接(目标始终是不同的索引节点),但它可能更适合您的用例。但是,如果您使用的是不支持写时复制的 ext4(就像现在的大多数人一样),那么这对您没有帮助。