如何清理日志文件?

Mic*_*ega 178 logs

有没有更好的方法来清理日志文件?我通常删除旧的日志文件并创建一个新的日志文件,我正在寻找一个较短的类型/bash/命令程序。如何使用别名?

pet*_*rph 351

> logfile
Run Code Online (Sandbox Code Playgroud)

或者

cat /dev/null > logfile
Run Code Online (Sandbox Code Playgroud)

或者

true | tee logfile
Run Code Online (Sandbox Code Playgroud)

(随意替换false或任何其他不产生输出的命令,例如:in bash)如果你想更有说服力,将全部为空logfile(实际上他们会将其截断为零大小)。

如果您想知道“需要”多长时间,您可以使用

dd if=/dev/null of=logfile
Run Code Online (Sandbox Code Playgroud)

dd if=/dev/null > logfile顺便说一下,这与 相同)

你也可以使用

truncate --size 0 logfile
Run Code Online (Sandbox Code Playgroud)

(或truncate -s 0 logfile) 完全明确,或者,如果您不想,

rm logfile
Run Code Online (Sandbox Code Playgroud)

(在这种情况下,您依赖于应用程序通常会重新创建日志文件(如果它不存在)的常见行为)。

但是,由于日志文件通常很有用,因此您可能需要压缩并保存副本。虽然您可以使用自己的脚本来做到这一点,但至少尝试使用现有的工作解决方案是一个好主意,在这种情况下logrotate,它可以做到这一点并且可以合理配置。

如果您需要为多个文件执行此操作,安全的方法是

truncate -s 0 file1 file2 ...
Run Code Online (Sandbox Code Playgroud)

或者

> file1 > file2 ...
Run Code Online (Sandbox Code Playgroud)

一些 shell ( zsh) 还允许指定多个重定向目标。

这有效(至少在bash),因为它创建了所有所需的重定向,尽管只有最后一个会捕获任何输入(或在这种情况下没有)。tee包含多个文件的示例在任何情况下都应该有效(假设您tee知道如何处理多个输出文件)

当然,好的旧 shell 循环也可以工作:

> logfile
Run Code Online (Sandbox Code Playgroud)

尽管由于命令为每个文件单独运行,它会慢得多。使用find以下方法可能会有所帮助:

find <criteria matching required files> \
    -exec <command capable of zeroing several files> {} \+
Run Code Online (Sandbox Code Playgroud)

或者

find <criteria matching required files> -delete
Run Code Online (Sandbox Code Playgroud)