我的主目录中有一个文本文件,该文件通过cron作业定期接收数据。因为cron作业提供动态数据,所以我也想设置一个cron作业以清空文件内容(该文件必须仍然存在)。我不需要cron帮助,只需要可以帮助清空文件的命令。
我的主目录中有一个文本文件,该文件通过cron作业定期接收数据。因为cron作业提供动态数据,所以我也想设置一个cron作业以清空文件内容(该文件必须仍然存在)。我不需要cron帮助,只需要可以帮助清空文件的命令。
Answers:
最简单的方法:
> filename
这是一种不太明显的方法,在其他人的shell脚本中可能不太可读,但这就是您所需要的。
因为>
实际上不是真正的命令(它是bash内置的),所以不能使用:
sudo > filename
当您对该文件没有权限时。但是您可以使用:
sudo bash -c "> filename"
sudo crontab -e
为root添加cron作业,而不适合您。或将文件权限更改为766(或666),而不是755 :sudo chmod 766 filename
。有关更多信息:codex.wordpress.org/Changing_File_Permissions
truncate filename
与将空输出重定向到文件相比,它更干净,更简单,并且不会遇到的问题sudo
。
truncate -s 0 filename
确实可以解决问题。您可以将其添加为答案。
为此目的创建了一个工具:
truncate -s 0 filename
这将清除内容,但仍将是同一文件(inode保持不变)。
这很重要,因为某些程序会通过“ inode”持有文件的句柄。假设您使用删除和重新创建文件的幼稚方法“清空”文件。某些程序可能仍会保留旧文件(包含旧内容)的句柄,即使按常规方法(如)不再可见ls
。
此答案结尾处有一些指向更多详细信息的链接。
另一种方法,也许更容易记住:
echo -n > filename
这也保持相同的inode。
请注意,两者truncate
和POSIXecho -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
有关即使文件已被删除仍使文件保持打开状态的程序的详细信息,您可以阅读以下内容:
要自动执行此操作,可以使用logrotate。只需为要清空的文件创建一个配置文件,添加其他设置,然后您可以根据每天选择的标准(或者当文件大于等时)自动将其每天清空。
看看这里如何配置logrotate:http : //linuxcommand.org/man_pages/logrotate8.html
echo "" > foo_file
是这样做的一个简单的方法,它将替换的所有内容foo_file与“”在这种情况下使其空。
您还可以使用cat /dev/null > foo_file
,它将读取空设备并完全覆盖您的文件。
tail -n +1000 file.txt > file.txt
应删除1000行并将最新行保留在文件中(您永远不知道何时可能需要一些最近记录来跟踪内容)。