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

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

有没有办法告诉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(就像现在的大多数人一样),那么这对您没有帮助。

相关内容