rɑː*_*dʒɑ 113 command-line bash files
如何在不打开文本文件的情况下清除文本文件中存在的文本?
我的意思是,例如我有一个文件,hello.txt其中包含一些文本数据,如何在不打开该文件的情况下清除该文件中的全部文本?
我的意思是不使用任何编辑器,如 nano、Gedit 等。
rɑː*_*dʒɑ 184
只要打开你的终端与CTRL+ ALT+T和类型
> hello.txt
Run Code Online (Sandbox Code Playgroud)
就是这样,您在该文件中的数据将被清除,甚至无需打开它。
例子:

era*_*man 48
截断文件的最简单方法是将 shell no-op 命令 ( :)的输出重定向到要擦除的文件。
: > hello.txt
Run Code Online (Sandbox Code Playgroud)
Don*_*ggs 23
我必须一直使用日志文件执行此操作。我发现的最简单的方法是使用以下命令:
cat /dev/null > hello.txt
Run Code Online (Sandbox Code Playgroud)
这将删除文件的所有内容,并为您留下一个空文件,而无需在编辑器中打开它,选择文本,任何此类内容。更具体地说,它的作用是用“/dev/null”的内容替换文件的内容,或者什么都不替换。实际上,它非常光滑。
唯一需要注意的是,您当前登录的用户必须具有对该文件的写权限。
sou*_* c. 14
我也将使用像 rajagenupula 的回答那样的重定向。但是有更多的灵活性。打开终端并输入,
cat > hello.txt
Run Code Online (Sandbox Code Playgroud)
然后按Ctrl+ C。它将清除以前的文件。如果你想要这么多,那很好。
如果您愿意,可以在擦除文件后执行更多操作。通过这种方式,您不仅可以在不打开文件的情况下擦除文件,还可以在文件中以正确的格式写入几行。假设您希望在擦除文件后写入“Ubuntu 是最好的操作系统”,只需执行
cat > hello.txt
Ubuntu is the
best OS
Run Code Online (Sandbox Code Playgroud)
然后按Ctrl+ C。现在之前的文件被清除了。同时,正如我所说的那样,单词分为两行。
看例子:

如果一个文件与名称创建hello.txt的和在终端然后提供一些文本下面的命令ctrl+ alt+t将删除所有文本hello.txt的文件,
echo "" > hello.txt
Run Code Online (Sandbox Code Playgroud)

另一种方法-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:$
Run Code Online (Sandbox Code Playgroud)
为什么会这样?这是如何工作的?该testFile.txt将被打开O_WRONLY|O_TRUNC,将被截断,该装置中的内容被丢弃和大小设置为零-标志,而如果该文件存在的手段。这与>shell中的运算符打开该运算符右侧的文件的标志相同。
接下来,cp将尝试从/dev/null读取 0 字节后读取将简单地关闭两个文件,从而testFile.txt截断并有效删除内容。
知道了这一点,理论上我们可以使用任何允许我们打开带有O_TRUNC. 例如这个:
dd of=testFile.txt count=0
Run Code Online (Sandbox Code Playgroud)
这里的小区别是dd根本不会执行任何操作read()。这个dd版本的一大优点是它是 POSIXly 可移植的。该DD规范状态:
如果还没有指定 seek= expr 转换,如果指定了显式 of= 文件操作数,则在复制开始之前应截断输出文件,除非指定了 conv= notrunc。
相比之下,cp /dev/null testFile.txt它不一定是可移植的,因为cp 的 POSIX 规范涵盖了只有在 source_file 是非常规的并且指定了-r/-R标志时才会发生的情况(非常感谢Stephen Kitt指出这一点),而不是当-r或-R被省略时会发生什么,这是这里的情况。然而,似乎至少 GNUcp默认使用相同规范中的规则 3,即截断现有文件而不更改其类型。
此答案基于Super User 的另一个答案。虽然不是最短的 bash 命令,truncate但对于普通新手来说是最易读的:
$ echo Hello > Hello.txt
$ echo World! >> Hello.txt
$ cat Hello.txt
Hello
World!
$ truncate -s 0 Hello.txt
$ ll Hello.txt
-rw-rw-r-- 1 rick rick 0 Mar 20 17:32 Hello.txt
Run Code Online (Sandbox Code Playgroud)
truncate此处与命令一起使用的参数:
的一个优点truncate是您可以指定要保留的数量,而不仅仅是零:
$ truncate -s 10000 Hello.txt
Run Code Online (Sandbox Code Playgroud)
... 将截断前 10,000 个字节之后的所有内容。如果程序发疯并将许多兆字节的数据转储到一个小日志文件中,这可能很有用:
truncate命令以获得 10K 的合理更大的正常大小