次のスクリプト (より大きなバックアップ スクリプトの一部) を正しく動作させることができません。
BACKUPDIR=/BACKUP/db01/physical/incremental # Backups base directory
FULLBACKUPDIR=$BACKUPDIR/full # Full backups directory
INCRBACKUPDIR=$BACKUPDIR/incr # Incremental backups directory
KEEP=5 # Number of full backups (and its incrementals) to keep
...
FIRST_DELETE=`expr $KEEP + 1` # add one to the number of backups to keep, this will be the first deleted
FILE0=`ls -ltr $FULLBACKUPDIR | awk '{print $9}' | tail -$FIRST_DELETE | head -1` # search for the first backup to be deleted
...
find $FULLBACKUPDIR -maxdepth 1 -type d ! -newer $FULLBACKUPDIR/$FILE0 -execdir echo "removing: "$FULLBACKUPDIR/$(basename {}) \; -execdir bash -c 'rm -rf $FULLBACKUPDIR/$(basename {})' \; -execdir echo "removing: "$INCRBACKUPDIR/$(basename {}) \; -execdir bash -c 'rm -rf $INCRBACKUPDIR/$(basename {})' \;
したがって、検索は正しく機能し、それ自体で次のようなものが出力されます。
/BACKUPS/db01/physical/incremental/full/2013-08-12_17-51-28
/BACKUPS/db01/physical/incremental/full/2013-08-12_17-51-28
/BACKUPS/db01/physical/incremental/full/2013-08-12_17-25-07
私が欲しいのは -exec 、何が削除されているかを示す行をエコーしてから、両方のディレクトリからフォルダーを削除することです。
ベース名だけを取得するためにさまざまな方法を試しましたが、何も機能していないようです。私はこれを得る:
removing: /BACKUPS/mysql/physical/incremental/full/"/BACKUPS/mysql/physical/incremental/full/2013-08-12_17-51-28"
removing: /BACKUPS/mysql/physical/incremental/incr/"/BACKUPS/mysql/physical/incremental/full/2013-08-12_17-51-28"
removing: /BACKUPS/mysql/physical/incremental/full/"/BACKUPS/mysql/physical/incremental/full/2013-08-12_17-25-07"
そしてもちろん、フォルダーは存在しないため削除されません。-f オプションが原因で、サイレントに失敗するだけです。-f を削除すると、各 rm で「見つかりません」というエラーが表示されます。
どうすればこれを達成できますか? バックアップとバックアップの一部は異なるストレージ システムに保存される可能性があるため、既知のパスで使用するフォルダー名を取得する機能が本当に必要です。