【问题标题】:Delete all files older than 30 days, based on file name as date根据文件名作为日期删除所有超过 30 天的文件
【发布时间】:2019-09-19 00:19:59
【问题描述】:

我是 bash 新手,我的任务是删除所有超过 30 天的文件,我可以根据文件名 Y_M_D.ext 2019_04_30.txt 来解决这个问题。

我知道我可以在包含文件的文件夹中列出所有带有ls 的文件。我知道我可以使用$ date 获取今天的日期,并且可以将其配置为匹配文件格式$ date "+%Y_%m_%d"

我知道我可以使用 rm 删除文件。

如何将所有这些结合到一个 bash 脚本中,该脚本删除从今天起超过 30 天的文件?

在伪 python 代码中,我猜它看起来像:

for file in folder:
    if file.name to date > 30 day from now:
        delete file

【问题讨论】:

  • 第一步是将字符串“YYYY_MM_DD.txt”转换为纪元时间。在有纪元时间之前,不要费心尝试比较日期。
  • date --date "2019/04/30" +"%s"date +"%s" 为您提供给定日期和今天的时间戳,您只需转换文件名,然后比较时间戳
  • 重复的 stackoverflow.com/questions/49294284/… 有几个额外的解决方案,但没有一个被支持。

标签: linux bash


【解决方案1】:

对于超过 X 天的删除文件,您可以使用此命令并将其安排在 /etc/crontab

find /PATH/TO/LOG/* -mtime +10 | xargs -d '\n' rm

find /PATH/TO/LOG/* -type f -mtime +10 -exec rm -f {} \

【讨论】:

  • 仅供参考:您的答案是根据修改日期删除文件,而问题是根据文件名解释为日期来删除文件。
【解决方案2】:

这是删除超过 30 天的日志文件的另一种解决方案:

#!/bin/sh

# A table that contains the path of directories to clean
rep_log=("/etc/var/log" "/test/nginx/log")
echo "Cleaning logs - $(date)."

#loop for each path provided by rep_log 
for element in "${rep_log[@]}"
do
   #display the directory
    echo "$element";
    nb_log=$(find "$element" -type f -mtime +30 -name "*.log*"| wc -l)
    if [[ $nb_log != 0 ]] 
    then
            find "$element" -type f -mtime +30 -delete 
            echo "Successfull!"
    else
            echo "No log to clean !"
    fi
done

允许包含多个删除文件的目录

rep_log=("/etc/var/log" "/test/nginx/log")

我们填充 var:我们正在搜索(在提供的目录中)超过 30 天且名称至少包含 .log 的文件。然后统计文件数。

nb_log=$(find "$element" -type f -mtime +30 -name "*.log*"| wc -l)

然后我们检查是否有除 0(正)以外的结果,如果是,我们删除

find "$element" -type f -mtime +30 -delete

【讨论】:

  • 抱歉,StackOverflow 是一个英文论坛。请edit你的答案翻译成英文(une réponse en français est hors sujet ici)
  • 是的,抱歉,我没有通知我是用法语回复的。
【解决方案3】:

我绝不是系统管理员,但您可以考虑一个简单的 shell 脚本,如下所示:

# Generate the date in the proper format
discriminant=$(date -d "30 days ago" "+%Y_%m_%d")

# Find files based on the filename pattern and test against the date.
find . -type f -maxdepth 1 -name "*_*_*.txt" -printf "%P\n" |
while IFS= read -r FILE; do
    if [ "${discriminant}" ">" "${FILE%.*}" ]; then
        echo "${FILE}";
    fi
done

请注意,这可能会被专业人士视为“外行”解决方案。也许awk 处理得更好,不幸的是我不习惯使用它。

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多