在名称中按日期删除文件

时间:2014-05-09 18:42:35

标签: bash shell sh

我有一个如下所示的文件列表:

...
live-2014-04-28.tar.bz2
live-2014-04-29.tar.bz2
live-2014-04-30.tar.bz2
live-2014-05-01.tar.bz2
live-2014-05-01.tar.bz2
live-2014-05-02.tar.bz2
...

...并尝试使用bash脚本删除一周以前的文件:

c=0
for i in `echo "ls /filebackup/daily" | sftp somepath.your-backup.de`
do
        c=`expr $c + 1`
        [ $c -le 3 ] && continue
        d=`echo $i | sed -r 's/[^0-9]*([0-9]+-[0-9]+-[0-9]+).*/\1/'`
        d=`date -d $d +'%s'`
        echo $c
        if [ `expr $dc - 691200` -ge $d ]
        then
                echo 'here file will be deleted'
        fi
done

我无法进入echo 'here file will be deleted',正在尝试调试 - 不太确定$dc部分的作用(我非常喜欢使用bash编码)。

我使用this article中的代码(请参阅文件备份脚本部分),并试图了解它为什么不能在我这边工作。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

这是一种做法。

#!/bin/bash

# Get the current and store in a variable
currDate=$(date +'%Y%m%d')  

# set this shell option to prevent literal match when no files exists
shopt -s nullglob

# Iterate over your directory
for file in *.bz2; do
    f=${file%%.*}                        # Strip the trailing extensions => live-2014-04-28
    f=${f#*-}                            # Strip the leading hyphen => 2014-04-28
    f=${f//-/}                           # Substitute all hyphens in date => 20140428
    if (( f <= (currDate - 7) )); then   # If the date is less than week old
        echo rm $file ...                # delete it
    fi
done

我已将echo放在rm命令之前,以便您可以测试输出。如果您对结果感到满意,则可以删除echo

答案 1 :(得分:1)

  

使用bash脚本来删除早于一周的文件。

如果忽略文件的名称并使用时间戳,该怎么办?

$ find . -name "live-*.tar.bz2" -mtime +7 -delete

这不完全是你想要的,但它很简单。