根据文件名作为日期,删除所有超过30天的文件

时间:2019-04-30 10:41:05

标签: linux bash

我是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

3 个答案:

答案 0 :(得分:4)

我绝不是系统管理员,但是您可以考虑以下简单的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可以更好地处理此问题,很遗憾,我不习惯使用它。

答案 1 :(得分: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")

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

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

然后我们检查是否存在除0(对映性)以外的结果,如果是,则删除

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

答案 2 :(得分: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 {} \