我正在尝试在使用时清空linux中的文件,它是一个日志文件,所以它是连续编写的.现在我用过:
echo -n > filename
Run Code Online (Sandbox Code Playgroud)
要么
cat /dev/null > filename
Run Code Online (Sandbox Code Playgroud)
但所有这一切都产生一个带有换行符的空文件(或者我可以看到的奇怪的字符^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ .. vi
)必须手动删除vi
和dd
第一行,然后保存.
如果我不使用vi
adn,dd
我无法操作文件,grep
但我需要一个可以在shell脚本中编写的自动过程.
想法?
pgl*_*pgl 25
这应该足以清空文件:
> file
Run Code Online (Sandbox Code Playgroud)
但是,您说过的其他方法也应该有效.如果你看到奇怪的字符,那么它们就会被其他东西写入文件 - 很可能是在那里记录的任何进程.
tor*_*rek 16
发生的事情很简单:你正在清空文件.
^@
你问为什么它充满了s?嗯,从一个非常真实的意义上讲,它不是.它不包含那些奇怪的字符.它有一个"洞".
被写入文件的程序编写与打开的文件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(包括0到65535)中没有数据,后面是字节偏移65536到73727中的一些数据(假设write
写入8192个字节)."丢失"数据是文件中的"漏洞".当其他程序去读取文件时,操作系统会假装那里有数据:全零字节数据.
如果执行write
操作的程序不在块边界上执行它们,则OS实际上将分配一些额外数据(以使写入适合整个块)并将其归零.那些零字节不是"漏洞"的一部分(它们在文件中是真正的零字节),而是普通的程序,它们不会在绿野仙踪的幕后偷看,"漏洞"零字节和"非" - "零字节是无法区分的.
您需要做的是修改要使用的程序O_APPEND
,或者使用syslog
知道如何配合日志轮换操作的库例程,或者两者兼而有之.
[编辑添加:不知道为什么这突然出现在首页上我回答了2011年的问题...]
另一种方式如下:
cp /dev/null the_file
Run Code Online (Sandbox Code Playgroud)
这种技术的优点是它是一个单一的命令,所以如果它需要sudo访问,只需要一个sudo调用.
为什么不只是:>filename
?
(:
是一个 bash 内置命令,与 具有相同的效果/bin/true
,并且两个命令都不回显任何内容)
证明它有效:
fg@erwin ~ $ du t.txt
4 t.txt
fg@erwin ~ $ :>t.txt
fg@erwin ~ $ du t.txt
0 t.txt
Run Code Online (Sandbox Code Playgroud)