如何根据文件名中的日期删除超过30天的文件

时间:2018-03-15 08:08:07

标签: bash shell unix

我每天都会更新CSV文件,我们根据文件名中的日期处理文件并删除超过30天的文件。 示例文件名:

XXXXXXXXXXX_xx00xx_**20171001**.000000_0.csv

我想在crontab中安排作业,每天删除30天的旧文件。

路径可以是/mount/store/ XXXXXXXXXXX_xx00xx_**20171001**.000000_0.csv

if [ $(date -d '-30 days' +%Y%m%d) -gt $D ]; then
    rm -rf $D
fi

上述脚本似乎对我没有帮助。请帮助我。 过去两天我一直在尝试这个。

使用CENTOS7

感谢。

4 个答案:

答案 0 :(得分:0)

对于所有文件:

  • 提取日期
  • 用该日期触摸文件
  • 使用-mtime选项删除文件

在所有文件的所需目录中执行此操作:

f=XXXXXXXXXXX_xx00xx_20171001.000000_0.csv
d=$(echo $f | sed -r 's/[^_]+_[^_]+_(20[0-9]{6})\.[0-9]{6}_.\.csv/\1/')
touch -d $d $f

在为整个目录执行该操作后,删除old-thans:

find YourDir -type f -mtime +30 -name "*.csv" -delete 

Gnu-sed有-delete选项。其他发现可能需要-exec rm ...。

之前测试。其他陷阱是不同类型的日期,受触摸(mtime,ctime,atime)影响。

测试,用触摸操纵日期:

touch XXXXXXXXXXX_xx00xx_20171001.000000_0.csv
f=XXXXXXXXXXX_xx00xx_20171001.000000_0.csv; d=$(echo $f | sed -r 's/[^_]+_[^_]+_(20[0-9]{6})\.[0-9]{6}_.\.csv/\1/'); touch -d $d $f 
ls -l $f
-rw-rw-r-- 1 stefan stefan 0 Okt  1 00:00 XXXXXXXXXXX_xx00xx_20171001.000000_0.csv

答案 1 :(得分:0)

从文件名中提取日期的有效方法是使用变量扩展

f=XXXXXXXXXXX_xx00xx_20171001.000000_0.csv
d=${f%%.*}    # removes largest suffix .*
d=${d##*_}    # removes largest prefix *_

或者使用bash特定的正则表达式

if [[ $f =~ [0-9]{8} ]]; then echo "$BASH_REMATCH"; fi

答案 2 :(得分:0)

如果您从the documentation获得pip install --upgrade google-cloud-storage ,则可以使用此解决方案。

dgrep

首先,我们可以使用ls *.csv | dateutils.dgrep -i '%Y%m%d' --le $(date -d "-30 day" +%F) | xargs -d '\n' rm ls来获取文件名列表。然后,我们可以将结果传递给find,以过滤包含与我们的条件匹配的日期字符串的文件名(在这种情况下超过30天)。最后,我们将结果传递给dgrep以删除所有匹配的文件。

  • xargs rm您的文件名中指定的输入日期格式
  • -i '%Y%m%d'过滤日期超过30天

您可以将--le $(date -d "-30 day" +%F)更改为rm以在实际删除命令之前测试该命令。

答案 3 :(得分:0)

以下方法不查看文件的任何生成时间信息,它假定文件名中的日期与创建文件的日期无关。

#/usr/bin/env bash
d=$(date -d "-30 days" "+%Y%m%d")
for file in /yourdir/*csv; do
     date=${file:$((${#file}-21)):8}
     (( date < d )) && rm $file
done
相关问题