0

我有一个创建 mysql 备份的脚本,文件最终被调用。

DB_name-M_D_Y.gz所以例如stackoverflow_users-04_10_2013.gz

现在我事先不知道文件的名称,只知道模式。

我需要做的是调整脚本,在它创建新备份之前,检查任何文件中的日期是否早于 7 天,如果是,则对这些进行其他操作。

我知道如何做其他事情,但是首先获取文件列表是困难的。

我不能只使用修改后的日期,因为文件会被其他脚本触及,因此需要从文件名中读取日期。

那么,如何获取文件列表?


为了回复评论,假设这个虚拟数据

当前日期:2013 年 4 月10

database zero-03_31_2013.gz    #Older | Notice this one has spaces
database_one-04_01_2013.gz     #Older
database_two-04_02_2013.gz     #Older
database_three-04_03_2013.gz   #Newer | Actually 7 days, but we want OLDER than!
database_four-04_04_2013.gz    #Newer
database_five-04_05_2013.gz    #Newer
dater.sh                       #Does not have the .gz extension | Not deleted

重击版本

matthew@play:~/test$ bash --version
GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
4

1 回答 1

5

尝试以下脚本:

#!/bin/bash

# get the date 7 days ago
sevenDaysAgo=$(date -d "-7 day 00:00:00" +%s)

# create an array to hold the files older than 7 days
result=()

# loop over the files
while IFS= read -d $'\0' -r file
do
    # extract the date from each filename using a regex
    if [[ $file =~ ^.*-([0-9]+)_([0-9]+)_([0-9]+).gz$ ]]
    then
        m="${BASH_REMATCH[1]}"
        d="${BASH_REMATCH[2]}"
        y="${BASH_REMATCH[3]}"
        fileDateTime="$(date -d ${y}${m}${d} +%s)"

        # check if the date is older than 7 days ago
        if (( fileDateTime < sevenDaysAgo ))
        then
            result+=( "$file" )
        fi
    fi
done < <(find . -type f -name "*.gz" -print0)

# print out the results for testing
for f in "${result[@]}"
do
    echo "$f"
done
于 2013-04-10T11:02:27.550 回答