在linux中使用时清空文件

Mir*_*chi 18 linux shell

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

echo -n > filename
Run Code Online (Sandbox Code Playgroud)

要么

cat /dev/null > filename
Run Code Online (Sandbox Code Playgroud)

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

如果我不使用viadn,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_APPENDwrite是,实际上,由之前lseek调用做了"寻求目前终端的文件,即文件的当前长度".当您截断文件"当前文件结束"将变为零(文件变空)时,搜索会将write偏移移动到位置0并且写入将转到那里.但程序没有使用O_APPEND,因此没有预先write"重新定位"操作,数据字节以当前偏移量写入(同样,我们声称上面是65536).

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

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

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

[编辑添加:不知道为什么这突然出现在首页上我回答了2011年的问题...]


ale*_*333 7

另一种方式如下:

cp /dev/null the_file
Run Code Online (Sandbox Code Playgroud)

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


fge*_*fge 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
Run Code Online (Sandbox Code Playgroud)