![一致地写入文件,同时保留其 inode](https://linux22.com/image/160630/%E4%B8%80%E8%87%B4%E5%9C%B0%E5%86%99%E5%85%A5%E6%96%87%E4%BB%B6%EF%BC%8C%E5%90%8C%E6%97%B6%E4%BF%9D%E7%95%99%E5%85%B6%20inode.png)
在不更改索引节点的情况下一致地编辑文件(此处使用的数据库系统术语意义上的一致性)的最佳方法是什么?通常,我会写入一个临时文件,然后调用rename(2)
,但由于这会更改 inode,所以这不是一个选项。我想到了类似的东西modify_file <file >tmp && cat <tmp >file
,但修改要么完全发生,要么根本不发生(modify_file
是修改标准输入内容的过程)。使用普通的 shell 实用程序可以实现这一点吗?我认为以下内容可能涵盖大多数情况(除了SIGKILL
断电之外):
(
flock -x 9
trap '' INT TERM # (perhaps other signals)
modify_file <file >tmp && cat <tmp >file
) 9>>file
对于只想更改文件的某个字节序列的子情况,会ed
是更好的选择吗?