如何使用 find 命令清除所有文件的内容

如何使用 find 命令清除所有文件的内容

是否有一个简单的步骤来清除所有内容 “。日志”使用 find 命令查找文件。

目前我正在使用“echo -n > filename.log”,我尝试过 echo -n > /var/application-logs/*.log,但它不起作用。

有没有更好的方法来清除多个文件的内容?

答案1

要清除所有find /var/application-logs -type f -name "*.log"发现的内容,请使用以下命令:

find /var/application-logs -type f -name "*.log" -exec tee {} \; </dev/null

如果您的 find 版本支持此功能,请使用+而不是\;对所有文件使用一次 tee 运行。或者,如果 shell glob 就足够了:

tee /var/application-logs/*.log </dev/null

答案2

如果你想阻止日志增长,请使用logrotate。您不应该因为日志已满而盲目地清除日志。如何操作适用于许多不同的发行版。

或者,考虑使用 syslog 服务器,例如rsyslogsyslog-ng

答案3

我遇到过类似的情况,我必须使用命令或 shell 脚本删除带有“.log”扩展名的 Docker 容器日志(这是特定于场景的)

以下是脚本

#!/bin/bash

#SHELL SCRIPT TO DELETE THE CONTENT OF THE DOCKER CONTAINER LOG FILES

#Declaring Array
file_list=()

#While loop to read log file name
 while IFS= read -d $'\0' -r file ; do
     file_list=("${file_list[@]}" "$file")
 done < <(find /var/lib/docker/containers/ -type f -name "*.log" -print0)

#Printing log file names
 echo "${file_list[@]}"

#Deleting the content of the log files
 for f in "${file_list[@]}";do
    if [ -f $f ]
    then
      : > "$f"
    fi
 done

Bash 元素的解释


file_list=()是一个包含结果的数组find /var/lib/docker/containers/ -type f -name "*.log"

使用 While 循环读取日志文件名

while IFS= read -d $'\0' -r file ; do
     file_list=("${file_list[@]}" "$file")
 done < <(find /var/lib/docker/containers/ -type f -name "*.log" -print0)

其中find子进程由while命令通过<

并且IFS= read -d $'\0' -r file是 while 条件

从命令中读取一行输入find

echo "${file_list[@]}"是打印存储在数组中的文件名。

for f in "${file_list[@]}";do
    if [ -f $f ]
    then
      : > "$f"
    fi
 done

在上面的 for-(if) 循环代码片段中,循环从数组中读取每个文件${file_list[@]},然后if语句使用以下命令then清除文件的内容: > "$f"

相关内容