3

データベースをバックアップするための bash スクリプトを作成しています。このスクリプトを毎日実行するように cron ジョブを既に設定しており、次の形式に従って .sql ファイルをダンプできます。

YYYYMMDD_HHMMSS-databasename.sql

YYMMDDタイムスタンプ形式の名前を考慮して、ファイル名部分を解析し、先週の日次ファイルをすべて選択する別の bash スクリプトを作成したいと思います。この新しい bash スクリプトは毎週実行されます。

これらの数値を正規表現を使用して日付に解析するにはどうすればよいですか?

4

4 に答える 4

2

RegExを使用してファイル名から日付部分を選択する:

^(20[12]\d)(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])_\d+-\w+\.sql$

ここで正規表現について説明しました:http://regex101.com/r/iU7wL5

正しい時間検証で更新する:

^(20[12]\d)(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])_([01]\d|2[0-3])[0-5]\d[0-5]\d-\w+\.sql$

説明されたデモ: http: //regex101.com/r/yV1dD7

注:これは2010〜2029の範囲の日付で機能し、ファイル名を出力形式に検証します

于 2013-03-21T14:29:11.463 に答える
2

ここに完全な解決策があります。これを試してください:

正規表現なしでオフセットカット(スクリプトがで実行されているときのように、例がすべてのファイルで同じ形式であると仮定しますcrontab):

cd /path/to/dumps
str='20130321_145907-databasename.sql'
for i in {7..14}; do
    curfile=$(date -d ${str:0:8} -d "$i days ago" '+%Y%m%d')*
    if [[ -s $curfile ]]; then
        # do something with "$curfile"
    fi
done

本当に正規表現が必要な場合:

cd /path/to/dumps
str='20130321_145907-databasename.sql'
if [[ $str =~ ^([0-9]{8})_[0-9]{6} ]]; then
    for i in {7..14}; do
        curfile=$(date -d ${BASH_REMATCH[1]} -d "$i days ago" '+%Y%m%d')*
        if [[ -s $curfile ]]; then
            # do something with "$curfile"
        fi
    done
fi

ノート

  • 行の最後のグロブ*に注意してくださいcurfile=
于 2013-03-21T13:56:31.357 に答える
1

bash 3+ の場合:

$ file=20130321_foo.log
$ [[ $file =~ ^[0-9]{8} ]]
$ echo ${BASH_REMATCH[0]}
20130321
$
于 2013-03-21T14:00:08.870 に答える
0

これはどうですか?

LAST_WEEK_BEG=$(date --date="-7 days" +%Y%m%d)
LAST_WEEK_END=$(date --date="-14 days" +%Y%m%d)


if [ $YOUR_DATE -ge "$LAST_WEEK_BEG" ] && [ $YOUR_DATE -le "$LAST_WEEK_END" ]; then
   do things
fi
于 2013-03-21T14:09:48.263 に答える