bash重定向替代而不是截断

时间:2018-10-18 14:35:48

标签: bash

假设我有一个文件foo.txt和一个硬链接bar.txt。当我这样做

> foo.txt

该文件将被截断,但该文件将被删除,因此bar.txt也将被清空。

是否存在一种可以完全替换实际文件的重定向形式,还是预先删除foo.txt的唯一方法?目标是替换foo.txt,但用旧数据保留bar.txt

2 个答案:

答案 0 :(得分:2)

我认为没有。

您想要的是为文件foo.txt获取一个新的索引节点,以使其独立于bar.txt(应该继续指向原始索引节点)。要获得新的inode,您首先必须放开原始的inode。为此,只有一个系统调用:unlink(2)。您可以使用rm(1)find -delete之类的其他工具从命令行调用它。

另一种方法是重命名原始文件,例如。 G。当然使用mv或使用cp -b之类的东西来隐式:

cp -b <(cat /dev/null) foo.txt

答案 1 :(得分:1)

文件系统无法区分foo.txtbar.txt;一个不比另一个更“真实”或“重要”,并且两个文件系统条目均相等地引用同一文件。无论您使用哪个名称,使用>都会打开相同的基础文件进行写入。

您要执行的操作是替换文件系统条目本身。为此,您首先需要一个新的空文件,然后可以对其进行重命名。

> new.txt
mv new.txt foo.txt