在linux中使用时清空文件

时间:2011-12-15 09:59:59

标签: linux shell

我正在尝试在使用时清空linux中的文件,它是一个日志文件,所以它是连续编写的。 现在我用过:

echo -n > filename

cat /dev/null > filename

但是所有这些都产生了一个带有换行符的空文件(或者我可以看到的奇怪的字符^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ .. vi)我必须先使用vidd第一行手动删除,然后保存。

如果我不使用vi adn dd我无法使用grep操作文件,但我需要一个可以在shell脚本中编写的自动过程。

想法?

6 个答案:

答案 0 :(得分:22)

这应该足以清空文件:

> file

但是,您说过的其他方法也应该有效。如果你看到奇怪的字符,那么它们就会被其他东西写入文件 - 很可能是在那里记录的任何进程。

答案 1 :(得分:13)

发生的事情很简单:你 清空文件。

为什么它会充满^@,那么,你问?嗯,从一个非常真实的意义上讲,它不是。它不包含那些奇怪的字符。它有一个“洞”。

正在写入该文件的程序正在编写一个使用O_WRONLY(或可能是O_RDWR)但 O_APPEND打开的文件。当您使用cp /dev/null filename: > filename或类似命令清空文件时,此程序已将65536个字节写入文件。

现在程序转到write另一块数据(比如4096或8192字节)。这些数据将写在哪里?答案是:“在底层文件描述符的当前搜索偏移量”。如果程序使用O_APPEND write,实际上会在lseek调用之前执行“寻找当前文件结束,即当前文件长度” 。当您截断文件“当前文件结束”将变为零(文件变为空)时,搜索会将write偏移移动到位置0并且写入将转到那里。但该程序没有使用O_APPEND,因此没有预先write“重新定位”操作,数据字节以当前偏移量写入(同样,我们声称为65536)上文)。

现在,您有一个在字节偏移0到65535(含)中没有数据的文件,后面是字节偏移65536到73727中的一些数据(假设write写入8192个字节)。 “丢失”数据是文件中的“漏洞”。当其他程序去读取文件时,操作系统假装那里有 数据:全零字节数据。

如果执行write操作的程序不在块边界上执行它们,则OS实际上将分配一些额外数据(以使写入适合整个块)并将其归零。那些零字节不是“漏洞”的一部分(它们在文件中是真正的零字节),而是普通的程序,它们不会在绿野仙踪的幕后偷看,“漏洞”零字节和“非” - “零字节无法区分。

您需要做的是修改程序以使用O_APPEND,或者使用知道如何配合日志轮换操作的库syslog等库例程,或者两者兼而有之。

[编辑添加:不知道为什么这突然出现在头版上,我在2011年回答了一个问题...]

答案 2 :(得分:6)

另一种方法如下:

cp /dev/null the_file

这种技术的优点是它只是一个命令,所以如果需要sudo访问,只需要一个sudo调用。

答案 3 :(得分:4)

为什么不只是:>filename

:是一个bash内置版,具有与/bin/true相同的效果,并且两个命令都不回显任何内容)

证明它有效:

fg@erwin ~ $ du t.txt
4       t.txt
fg@erwin ~ $ :>t.txt
fg@erwin ~ $ du t.txt
0       t.txt

答案 4 :(得分:3)

如果是日志文件,那么正确的方法是使用logrotate。如你所说,手动操作不起作用。

答案 5 :(得分:0)

我这里没有linux shell试试ir,但你试试这个吗?

echo "" > file