0

バックアップ スクリプト内で、7 日間分のバックアップのみを保持したいと考えています (これに logrotate を使用してみましたが、完全に機能しましたが、cron.daily のタイミングとそれが「dateext」にどのように影響するかという問題に遭遇しました)。パラメータ拡張を使用してファイル名から日付を抽出する際に問題が発生しています。

いくつかのファイルの例を次に示します

  • foo.bar.tar.gz-20120904
  • bar.baz.tar.gz-20120904
  • ...

これが私のbashスクリプトです:

#!/bin/bash

path="/foo/"
today=$(date +%Y%m%d)
keepDays=7
keepSeconds=$(date -d "-$keepDays day" +%s)

for f in $path"*"; do
  fileSeconds=$(date -d ${f##*-} +%s)
  if [ $fileSeconds -lt $keepSeconds ]
    then
        rm $f
  fi
done

これが私が得ているエラーです:

date: extra operand `/foo/foo.bar.tar.gz-20120904'
4

2 に答える 2

3

*グロビングを防止する , を囲む引用符を削除します。

for f in ${path}*; do

({ }ここでは厳密には必須ではありませんが、読みやすくします)

質問の一部ではありませんが、Bourne シェル構文は、どちらがより安全であるかを[ $fileSeconds -lt $keepSeconds ]記述することができます。(( $fileSeconds < $keepSeconds ))

于 2012-09-04T16:00:46.983 に答える
1

cdarkeが言うよう*に、forループ内の引用符を削除します。

for f in ${path}/*; do

実行中のシェルdateが「/foo/*」を取得し、それをファイル名のリスト (複数) に展開してから、リストの${f##*-}一部を使用し、date複数の名前とオブジェクトで呼び出されます。

たとえば、で実行した場合、これが表示bash -x your-script.shされます。何か不思議なことが起こったとき、最初のステップは、シェルが何をしているのかを確実に知ることです。echo "$f"ループにorを追加するecho $fと理解に役立ちますが、2 つの異なる答えが得られます。

于 2012-09-04T17:25:27.537 に答える