假设我有一个文件foo.txt
和一个硬链接bar.txt
。当我这样做
> foo.txt
该文件将被截断,但该文件将被删除,因此bar.txt
也将被清空。
是否存在一种可以完全替换实际文件的重定向形式,还是预先删除foo.txt
的唯一方法?目标是替换foo.txt
,但用旧数据保留bar.txt
。
答案 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.txt
和bar.txt
;一个不比另一个更“真实”或“重要”,并且两个文件系统条目均相等地引用同一文件。无论您使用哪个名称,使用>
都会打开相同的基础文件进行写入。
您要执行的操作是替换文件系统条目本身。为此,您首先需要一个新的空文件,然后可以对其进行重命名。
> new.txt
mv new.txt foo.txt