清空文本文件的内容


16

我的主目录中有一个文本文件,该文件通过cron作业定期接收数据。因为cron作业提供动态数据,所以我也想设置一个cron作业以清空文件内容(该文件必须仍然存在)。我不需要cron帮助,只需要可以帮助清空文件的命令。


5
替代方案:tail -n +1000 file.txt > file.txt应删除1000行并将最新行保留在文件中(您永远不知道何时可能需要一些最近记录来跟踪内容)。
Rinzwind

2
这实际上是比按计划的时间清除文件更好的选择。
布鲁诺·佩雷拉

1
@Rinzwind,将不起作用,因为文件将在尾部尝试读取之前被截断。您需要重定向到一个新文件,然后用新文件替换原始文件。
psusi 2013年

True @psusi :)那里需要额外的重定向。
Rinzwind 2013年

Answers:


28

最简单的方法:

> filename

这是一种不太明显的方法,在其他人的shell脚本中可能不太可读,但这就是您所需要的。

因为>实际上不是真正的命令(它是bash内置的),所以不能使用:

sudo > filename

当您对该文件没有权限时。但是您可以使用:

sudo bash -c "> filename"

需要更改哪种权限,因为它说权限被拒绝,我已经对文件执行了chmod 755,或者应该将其
设为

@sosytee看到我的新编辑。
RaduRădeanu13年

1
@sosytee当然可以,但是用于sudo crontab -e为root添加cron作业,而不适合您。或将文件权限更改为766(或666),而不是755 :sudo chmod 766 filename。有关更多信息:codex.wordpress.org/Changing_File_Permissions
RaduRădeanu13年

1
truncate filename与将空输出重定向到文件相比,它更干净,更简单,并且不会遇到的问题sudo
psusi 2013年

1
@psusi truncate -s 0 filename确实可以解决问题。您可以将其添加为答案。
RaduRădeanu2013年

19

为此目的创建了一个工具:

truncate -s 0 filename

这将清除内容,但仍将是同一文件(inode保持不变)。

这很重要,因为某些程序会通过“ inode”持有文件的句柄。假设您使用删除和重新创建文件的幼稚方法“清空”文件。某些程序可能仍会保留旧文件(包含旧内容)的句柄,即使按常规方法(如)不再可见ls

此答案结尾处有一些指向更多详细信息的链接。


另一种方法,也许更容易记住:

echo -n > filename

这也保持相同的inode。

请注意,两者truncatePOSIXecho -n均未定义。

为了符合POSIX,请使用cat /dev/null

cat /dev/null > filename

还有另一种方式,更加晦涩难懂,而且可能与外壳无关:

> filename

如果要截断的文件需要root特权才能写入,则以下几行将无法正常运行:

sudo echo -n > filename
sudo cat /dev/null > filename
sudo > filename

这是因为即使在执行sudo之前,外壳程序仍会完成重定向。这意味着对文件的写访问是使用运行Shell的用户的特权而不是sudo会授予的特权来完成的。

一种解决方法是将重定向重定向到使用sudo特权执行的shell,如下所示:

sudo sh -c "echo -n > filename"

使用truncate您不需要这种解决方法,因为写访问权限不是由外壳truncate程序执行的,而是由sudo使用sudo特权执行的。

sudo truncate -s 0 filename

有关即使文件已被删除仍使文件保持打开状态的程序的详细信息,您可以阅读以下内容:


它说权限被拒绝,使用了chmod 755文件名,但仍然被拒绝
sosytee 2013年

2
也许您在bash中启用了noclobber?
lesmana 2013年

到目前为止,最完整的答案
-AbdelHady

4

要自动执行此操作,可以使用logrotate。只需为要清空的文件创建一个配置文件,添加其他设置,然后您可以根据每天选择的标准(或者当文件大于等时)自动将其每天清空。

看看这里如何配置logrotate:http : //linuxcommand.org/man_pages/logrotate8.html


1
我本人赞成这个选择。我们使用“文件> 10 Mb”->“ tar.gz将其备份”“空文件”。900天后,备份将被删除。
Rinzwind 2013年

3

echo "" > foo_file是这样做的一个简单的方法,它将替换的所有内容foo_file“”在这种情况下使其空。

您还可以使用cat /dev/null > foo_file,它将读取空设备并完全覆盖您的文件。


它说权限被拒绝,使用了chmod 755文件名,但仍然被拒绝
sosytee 2013年

您可以和普通用户一起阅读文件权限吗?
布鲁诺·佩雷拉

是的,我可以普通用户身份阅读内容
sosytee 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.