【发布时间】:2015-03-15 17:17:01
【问题描述】:
作为一个简单的例子,考虑以下命令:
$ sort file.txt
这将按排序顺序输出文件的数据。如何将这些数据直接放回同一个文件中?我想用排序结果更新文件。
这不是解决方案:
$ sort file.txt > file.txt
... 因为它会导致文件出现空白。有没有办法在不创建临时文件的情况下更新这个文件?
当然,我可以这样做:
sort file.txt > temp.txt; mv temp.txt file.txt
但我宁愿将结果保存在内存中,直到处理完成,然后将它们写回同一个文件。 sort 实际上有一个标志可以让这成为可能:
sort file.txt -o file.txt
...但我正在寻找一种不依赖于具有特殊标志的二进制文件来解决此问题的解决方案,因为并非所有都可以保证。是否有某种 linux 命令可以保存数据直到处理完成?
【问题讨论】:
-
你知道
mv真的是重命名,对吧?使用临时文件的好处是当你的机器在sort中间崩溃时不会导致问题(例如)。 -
@rici 是的,mv 为我覆盖了文件。这模拟更新文件。无论如何,我正在寻找不需要中间文件的解决方案。
-
mv不会覆盖文件。它只是重命名它。当然,确实有一段时间两个文件同时存在,但假设数据可以放入内存,这可能不会对您的磁盘造成太大负担。事实上,许多声称“就地”工作的实用程序(包括 sed)实际上使用临时文件,既安全又简单。
标签: linux shell command pipe in-place