我正在尝试在使用时清空linux中的文件,它是一个日志文件,所以它是连续编写的。 现在我用过:
echo -n > filename
或
cat /dev/null > filename
但是所有这些都产生了一个带有换行符的空文件(或者我可以看到的奇怪的字符^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ .. vi
)我必须先使用vi
和dd
第一行手动删除,然后保存。
如果我不使用vi
adn dd
我无法使用grep
操作文件,但我需要一个可以在shell脚本中编写的自动过程。
想法?
答案 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