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


11

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

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

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

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

cp -fl $^ $@ || cp -f $^ $@

在设备间链接的情况下,这当然会产生虚假的错误消息,尽管随后第二次cp调用成功了。而且,这将被扩展(毕竟源代码形式看起来可读),它将不再变得易读。

Answers:


8

cp没有此选项。您可以编写包装器脚本,但这很简单。

ln -f $^ $@ 2>/dev/null || cp -f $^ $@

GNU Coreutils 7.5引入了该--reflink选项。如果通过--reflink=auto并且基础文件系统支持写时复制(例如Btrfs或ZFS)并且该副本恰好位于同一设备上,cp则将创建一个新的inode但不复制内容。否则cp执行普通复制。这仍然不是硬链接(目标将始终是不同的inode),但对于您的用例来说可能更好。但是,如果您使用的是ext4(像当今的大多数人一样),而它不支持写时复制功能,那么这将无济于事。


1
谢谢,对于$$我来说,双精度数当然是因为它在宏中。当然,您的产品线是我使用的产品的变体。但是至少我以这种方式知道它作为选项不存在,我需要提供自己的选项。
0xC0000022L13年

1
@ 0xC0000022L顺便说一下,几年后,当btrfs取代ext4时,您可能想使用废料ln并使用cp --reflink=auto(请参阅我更新的答案)。
吉尔斯(Gilles)'所以

谢谢,非常感谢。尽管我在某个时候已经看到了该选项,但并没有意识到。
0xC0000022L13年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.