根据文件名日期删除所有早于30天的文件

3

我是一名新手,需要使用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”转换为时代时间。在获得时代时间之前,请不要尝试比较日期。 - William Pursell
date --date "2019/04/30" +"%s"date +"%s" 可以为给定日期和今天提供时间戳,您只需要转换文件名,然后比较时间戳即可。 - Alex
3个回答

7

我并不是一名系统管理员,但你可以考虑编写一个简单的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 处理,但我很遗憾不习惯使用它。


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")

我们填充变量:在提供的目录中,搜索文件名包含至少 .log 并且早于 30 天的文件,然后计算文件数量。最初的回答。
nb_log=$(find "$element" -type f -mtime +30 -name "*.log*"| wc -l)

我们接着检查是否存在不为0(即正数)的结果,如果是,则删除。最初的回答中的内容如上所述。
find "$element" -type f -mtime +30 -delete

抱歉,StackOverflow是一个英文论坛。请编辑您的回答将其翻译成英文(法语回答在这里不合适)。 - Basile Starynkevitch
对不起,我没有通知我用法语回复。 - Jean

0

如果要删除 X 天前的文件,您可以使用以下命令并在 /etc/crontab 中安排计划:

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

或者

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


FYI:您的答案是关于根据修改日期删除文件,而问题是关于根据文件名解释为日期来删除文件。 - mbdevpl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接