我每天都会更新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
感谢。
答案 0 :(得分:0)
对于所有文件:
在所有文件的所需目录中执行此操作:
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