Contents

在Linux中快速清除文件内容

1. 概述

有时,我们希望通过 Linux 命令行快速只清除一个文件的内容,并保留空文件。

在本教程中,让我们看看如何实现这一目标。

2. 问题介绍

像往常一样,让我们通过一个例子来理解这个问题。假设我们有一个非空文本文件:

$ cat input.txt
Hi there,
   I'm not an empty file.
Bye.

现在,我们想清除input.txt文件的内容但保留该文件。所以,最后,我们希望看到文件变空。 为了验证它,我们可以使用wc 命令检查文件的字节数。如果一个文件是空的,结果应该是 0:

$ wc -c input.txt
0 input.txt

接下来,让我们看看如何清空一个文件。

3. 使用命令

我们可以通过在目标文件上执行一些命令来完成这项工作。接下来,让我们看看它们的实际效果。

通常,我们在Linux中使用cp命令来拷贝文件。另外,我们知道*/dev/null 是每个 Linux 系统中都存在的特殊文件。通常,*我们使用/dev/null来处理不需要的进程输出流,或者作为输入流的方便的空文件**。

因此,我们可以将 /dev/null复制到input.txt中清空目标文件:

$ cp /dev/null input.txt 
$ wc -c input.txt
0 input.txt

如上面的输出所示,文件已清空。 sed 是一个强大的文本处理工具。它支持就地更改功能。例如,我们可以使用GNU Sed 的-i选项来进行就地更改。

因此,我们可以使用sed就地删除给定文件中的所有内容。让我们恢复 input.txt文件,看看如何做:

$ sed -i 'd' input.txt 
$ wc -c input.txt
0 input.txt

如 上面的sed命令所示,我们只使用 sed的“ d ”命令来删除 input.txt中的所有内容。

在 Linux 中,命令truncate 将文件收缩或扩展到给定大小。因此,我们可以将文件truncate到“ 0 ”大小以清除其内容

$ truncate -s 0 input.txt 
$ wc -c input.txt
0 input.txt

4.使用重定向

到目前为止,我们使用了不同的命令来清除input.txt文件。或者,在 Linux 中,我们可以使用IO 重定向 更改文件的内容。

例如,我们知道*/dev/null*提供了一个空输入,所以我们可以将命令“ cat /dev/null ”的输出重定向到目标文件以清除其内容

$ cat /dev/null > input.txt
$ wc -c input.txt
0 input.txt

同样,我们可以将echo的输出重定向到目标文件:

$ echo -n '' > input.txt
$ wc -c input.txt 
0 input.txt

值得一提的是,我们需要-n*选项。否则,文件不为空。相反,它将包含一个尾随换行符*:

$ echo '' > input.txt
$ wc -c input.txt
1 input.txt

正如我们所见,使用重定向清空文件的命令非常紧凑。接下来,让我们探索一些更快捷的方法来做到这一点。 : > FILE ”可以将FILE截断为零长度

$ : > input.txt
$ wc -c input.txt
0 input.txt

上面命令中的’ : ’ 用作虚拟命令,不产生任何输出。

如果我们使用 Bash,我们甚至可以保存冒号字符:

$ > input.txt
$ wc -c input.txt 
0 input.txt

但是,我们应该注意,这不适用于所有 shell。例如,它在 Zsh 中不起作用

在 Zsh 中,我们可以使用“ : > input.txt ”。

5.需要sudo

我们已经学习了如何以不同的方式清空文件。到目前为止,在所有示例中,我们假设当前登录用户对input.txt文件具有“写入”权限。

接下来,让我们看看如何清空当前用户没有写入权限的文件。

我们知道 sudo 允许我们在超级用户的许可下执行命令。因此,假设我们的用户可以使用sudo,我们可以使用 sudo来清除目标文件。让我们看一个例子:

$ ls -l input_super.txt
-rw-r--r-- 1 root root 41 Apr 18 15:56 input_super.txt

如 ls命令所示,文件input_super.txt 的长度为 41 个字节。而且,只有root用户对其有“写”权限。

如果我们决定使用基于命令的方法来清空文件,那很简单——只需在命令前添加sudo即可:

$ sudo cp /dev/null input_super.txt
[sudo] password for kent: 
$ wc -c input_super.txt 
0 input_super.txt

如上例所示,我们使用 sudo执行了cp命令。在提供当前用户 ( kent ) 的密码后,文件被成功清除。

但是,如果我们想以基于重定向的方式清空文件,只需在命令前添加sudo是行不通的:

$ sudo echo -n '' > input_super.txt
bash: input_super.txt: Permission denied

我们可能想知道为什么即使我们使用了sudo,它也会抱怨权限问题。这是因为虽然echo命令是在超级用户的权限下执行的,但重定向是由 shell 执行的,它没有写入文件input_super.txt的权限。

为了解决这个问题,我们可以 使用sudo运行一个 shell,并使用*-c*选项将命令传递给它:

$ sudo sh -c "echo -n '' > input_super.txt"
[sudo] password for kent:
$ wc -c input_super.txt
0 input_super.txt