我知道从文件中删除所有条目的三种方法。
他们是
>filename
touch filename
1filename < /dev/null
在这三个中,我滥用>filename
最多,因为它需要最少的击键次数。
但是,我想知道就大日志文件和小文件而言,这三个中哪个最有效(如果有更有效的方法)。
另外,这三个代码是如何操作和删除内容的?
1编辑:正如在这个答案中所讨论的,这实际上并没有清除文件!
我正在尝试从 发送消息kafka-console-producer.sh
,即
#!/bin/bash
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
export KAFKA_HEAP_OPTS="-Xmx512M"
fi
exec $(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleProducer "$@"
Run Code Online (Sandbox Code Playgroud)
然后我通过 Putty 终端粘贴消息。在接收端,我看到消息大约被截断到 4096 字节。我在卡夫卡的任何地方都没有看到设置了这个限制。
这个限制可以来自 bash/terminal 或 Putty 吗?
可以删除 a 的尾随字节,file
而无需写入新文件 ( > newfile
) 并将其移回 ( mv newfile file
)。这是通过以下方式完成的truncate
:
truncate -s -1 file
Run Code Online (Sandbox Code Playgroud)
可以删除前导字节,但通过移动它(这会改变 inode)(对于某些版本的 tail):
tail -c +1 file > newfile ; mv newfile file
Run Code Online (Sandbox Code Playgroud)
那么:如何在不移动文件的情况下做到这一点?
理想情况下,就像截断一样,即使对于非常大的文件也只需要更改几个字节。
注意:sed -i
将更改文件索引节点,因此,即使它可能有用,也不是这个问题的答案(IMO)。
$ timeout 1 cat /dev/zero > file1
$ wc -c file1
270422016 file1
$ du file1
264084 file1
Run Code Online (Sandbox Code Playgroud)
问题 :
(1)270422016个空字符怎么出来就是264084字节(即258M)。
$ truncate -s 270422016 file2
$ wc -c file2
270422016 file2
$ du file2
0 file2
Run Code Online (Sandbox Code Playgroud)
问题 :
(2)file2
已使用与file1
之前相同数量的空字符创建,但 的大小file2
为零,为什么?
(3) 什么是/dev/zero
做了而truncate
没有做的,反之亦然?