如何在不打开文本文件的情况下清除其中存在的文本?
我的意思是,例如我有一个文件,hello.txt
里面有一些文本数据,我怎样才能清除该文件中的所有文本不用打开吗?
我的意思是不使用任何编辑器,如 nano、Gedit 等。
答案1
只需使用CTRL++打开终端并输入ALTT
> hello.txt
就是这样,即使不打开该文件,其中的数据也会被清除。
例子:
答案2
截断文件的最简单方法是将 shell no-op 命令 ( :
) 的输出重定向到要删除的文件。
: > hello.txt
答案3
我必须一直对日志文件执行此操作。我发现最简单的方法是使用以下命令:
cat /dev/null > hello.txt
这会删除文件的全部内容,只留下一个空文件,而不必在编辑器中打开它、选择文本或执行任何其他操作。更具体地说,它的作用是将文件的内容替换为“/dev/null”的内容,或者什么都不替换。实际上,这非常巧妙。
唯一需要注意的是,您当前登录的用户必须对该文件具有写权限。
答案4
另一种方法-cp
文件/dev/null
xieerqi:$ cat testFile.txt
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 115247656 83100492 26269816 76% /
none 4 0 4 0% /sys/fs/cgroup
udev 2914492 4 2914488 1% /dev
tmpfs 585216 1152 584064 1% /run
none 5120 0 5120 0% /run/lock
none 2926072 98096 2827976 4% /run/shm
none 102400 76 102324 1% /run/user
xieerqi:$ cp /dev/null testFile.txt
xieerqi:$ cat testFile.txt
xieerqi:$
为什么这样做有效,又是如何工作的?testFile.txt
将使用标志打开,这意味着如果文件存在 - 它将会被截断,这意味着内容将被丢弃,大小将被设置为零。这与shell 中运算符在其右侧打开文件时O_WRONLY|O_TRUNC
使用的标志相同。>
接下来,cp
将尝试读取/dev/null
,读取 0 字节后将关闭两个文件,从而使testFile.txt
文件被截断并且内容被有效删除。
知道了这一点,理论上我们可以使用任何允许我们打开文件的东西O_TRUNC
。例如:
dd of=testFile.txt count=0
这里的小区别是根本dd
不会执行任何操作read()
。此dd
版本的最大优点是它是 POSIX 可移植的。dd 规格状态:
如果未指定 seek=expr 转换,则在指定了明确的 of=file 操作数的情况下,输出文件应在开始复制之前截断,除非指定了 conv=notrunc。
相比之下,cp /dev/null testFile.txt
它不一定是可移植的,因为cp 的 POSIX 规范介绍仅当 source_file 为非常规文件且指定-r
/标志时才会发生的情况(非常感谢-R
史蒂芬·基特感谢指出这一点),但不知道省略-r
或时会发生什么-R
,这里就是这种情况。不过,至少 GNUcp
默认使用同一规范中的规则 3,即截断现有文件而不更改其类型。