用自己覆盖文件的最佳方法

时间:2014-05-08 17:24:22

标签: linux bash shell

读取文件然后将内容写入同一文件的最快/最优雅方式是什么?

在Linux上,这并不总是与触摸'一个文件,例如如果文件代表某些硬件设备。

对我有用的一种可能性是echo $(cat $file) > $file,但我想知道这是否是最佳做法。

3 个答案:

答案 0 :(得分:3)

您不能一步完成此操作,因为写入文件会干扰从中读取。如果您在常规文件上尝试此操作,则>重定向可能会在读取任何内容之前将文件清空。

你最安全的选择是分成两步。如果需要,可以将其隐藏在函数调用后面。

rewrite() {
    local file=$1

    local contents=$(< "$file")
    cat <<< "$contents" > "$file"
}

...

rewrite /sys/misc/whatever

答案 1 :(得分:3)

moreutils package中的海绵实用程序允许此

~$ cat file
foo
~$ cat file | sponge file
~$ cat file
foo

答案 2 :(得分:1)

我理解您对简单touch $file感兴趣,而是对文件进行转换。

由于文件的转换可能会导致其暂时损坏,因此将其设置到位是不好的,而其他人可能会在同一时刻阅读它。

由于该临时文件是您的最佳选择,并且只有在您转换文件时,您应该只需一步替换该文件:

cat "$file" | process >"$file.$$"
mv "$file.$$" "$file"

这是最安全的操作。

当然我省略了像&#39;检查文件是否真的存在的操作&#39;等等,留给你。