Contents

清空文件的内容

1. 概述

当我们在 Linux 中处理文件时,通常需要清空其中的一些文件。日志文件是一个很好的例子,我们希望不时清除它们。

在本教程中,我们将通过一些实际示例来了解实现这一目标的几种方法。

2. 创建我们的示例文件

在开始之前,让我们创建一个名为original_file的文件,其中包含一些文本行:

$ cat << eof > original_file
one two
three four
eof

然后,我们将创建另一个作为我们将要工作的副本:

$ cp original_file example_file

在我们测试每个场景后,我们必须这样做以重新填充文件。

3. 使用特定于 Shell 的命令

首先,我们可以使用我们正在使用的 shell 的某些特性。

例如,在我们使用 Bash 的情况下,我们只需键入*>*字符:

$ > example_file

使用内置冒号:

$ : > example_file

真正的内置:

$ true > example_file

但是,在 Zsh 中,我们只能快速使用我们的两种方法。

$ : > example_file
$ true > example_file

两者都不执行任何操作并返回退出状态 0。 现在,让我们尝试:

$ > example_file

什么也没有发生:shell 需要输入。但是,如果我们按ctrl +  d我们发送文件结尾,最后,我们可以检查文件的大小以确认文件没有内容。

由于clobbernoclobber选项,我们可以这样做(不管有没有冒号) 。否则,我们会收到以下消息:

zsh: file exists: example_file

在这种情况下,我们可以通过以下方式解决:

  • 输入setopt clobber,再试一次我们过去的策略
  • 输入 unsetopt noclobber,然后再试一次
  • 使用*!在我们过去的一些策略中的>字符之后 - 例如:>!示例文件*

4. 发送空字符串

解决问题的另一种方法是向文件发送一个空字符串。 我们可以使用echo命令 来实现:

$ echo -n > example_file

在这里,使用*-n参数,我们防止echo*添加默认添加的换行符。 我们还可以使用printf命令:

$ printf '' > example_file

我们可以采取的另一种方法是使用这里文档指定一些字符串,比如说EOF

$ cat << EOF > example_file

等待,然后只写EOF,然后按Enter

5. 使用特定尺寸

删除文件内容的另一种方法是将文件大小设置为零。 让我们尝试使用truncate 命令:

$ truncate -s 0 example_file

我们也可以使用dd 命令来解决这个问题:

$ dd if=/dev/urandom of=example_file bs=1 count=0

在之前的方法中,我们使用了/dev/urandom文件,但我们可以使用任何文件,只要count*参数为零,就没有区别。*

6. 使用*/dev/null*

/dev/null 文件非常有用和舒适,因为如果我们写入它,它允许我们丢弃那里发送的内容,或者,如果我们从中读取,它会返回文件结尾。 让我们尝试使用带有dd命令的*/dev/null*文件:

$ dd if=/dev/null of=./example_file

我们可以用cat 得到同样的结果:

$ cat /dev/null > example_file

或与cp

$ cp /dev/null example_file

7. 使用awksed

sed 是一个有用且强大的工具,我们可以用它来解决我们的问题:

$ sed -i 'd' example_file

使用参数*-i*,我们指示sed在文件中进行所有更改。

使用d命令,我们指示sed删除整行。由于sed将逐条记录,因此最终文件将为空。

我们可以使用GNU Awk 实现类似的效果:

$ gawk -i inplace '0' example_file

由于awk中的 0 将被评估为false,因此我们通过返回“ 0 ”来强制awk忽略所有输入行,然后将空行保存回输入文件。

**如果我们有 GNU Awk 4.1.0 或更高版本,我们只能使用“ -i inplace ”选项。**如果我们的 awk 中没有就地扩展,我们仍然可以通过临时文件来实现:

$ awk '0' example_file > tmp_file && mv tmp_file example_file

另请注意,这些策略在保持文件名的同时更改了 inode 编号。他们也很慢,因为他们检查文件。