Bash、古いファイルの検索と削除

Bash、古いファイルの検索と削除

バックアップファイルにスクリプトを作成し、古いバックアップを削除します。

#!/bin/sh

BACKUPDIR=/var/backups/files
ROTATE=1

mkdir -p $BACKUPDIR

CURRENT="$BACKUPDIR/`date +%Y-%m-%d`-files.tar.gz"

cd /var/ && tar czf $CURRENT www

find $BACKUPDIR -type f -mtime $ROTATE -exec rm {} \;

chmod 0600 $BACKUPDIR/*

コマンドライン(テスト用):

find $BACKUPDIR -type f -mtime $ROTATE -exec rm {} \;

どういうわけかスクリプトは機能しません。しかし、コンソールで実行すると、すべてがうまく機能し、古いファイルが削除されます。ただし、スクリプトを実行するとファイルは削除されません(スクリプトの実行時にtarアーカイブが生成されます)。なぜ?

スクリプト権限はです755

ベストアンサー1

Fiximanが提案したようにこのオプションを使用したいかもしれませんが-delete、あなたの場合はほとんど影響を与えませんが、スペースやその他の特殊文字を含むファイル名を入力するとスクリプトは失敗します

#!/bin/sh -e

BACKUPDIR=/var/backups/files

# I suggest a little more than 1 day (i.e. about 1 week of backups is
# probably safer.)
ROTATE=7

mkdir -p $BACKUPDIR

CURRENT="$BACKUPDIR/`date +%Y-%m-%d`-files.tar.gz"

# Create protected file, then backup data in it
touch $CURRENT
chmod 600 $CURRENT
cd /var/ && tar czf $CURRENT www

# Here we have the attempt at deleting, notice the "+"
find $BACKUPDIR -type f -name '*-files.tar.gz' -mtime +$ROTATE -delete

何:

  1. ROTATE=1あまり意味がないようです。場合に備えて、複数のバックアップが必要な場合があります。数日以内に問題が発生していることがよくわかります。昨夜のバックアップのみお持ちの方は幸運です!

  2. chmod 600 $CURRENTこれはできるだけ早く行う必要があります。ファイルセキュリティが本当に心配な場合は、タールボールを作成する前に実行してください(私の例のように)。

  3. 数字の前にfind1を追加することで修正されました。毎回受ける話なので気分悪くないでください。実際に使ってみると+$ROTATE+より古いまたはそれに対応する、 "-"を使用すると、テストはキャンセルされます(したがって --mtime +7とほぼ同じで、! -mtime -7おそらく1日以内に片側または他の側と一致しません)、使用する通常の数字を使用してください(-mtime 1)。これによりファイルが削除されます。特定の日付に修正されました。スクリプトが3日間実行されないと、これら3つのファイルは削除されません。

  4. 使い方が簡単な-delete ので、サンプルコードで見つからない参照を考慮する必要はありません(たとえば、-exec rm "{}" \;ファイル名に特殊文字が含まれている場合など)

  5. -name問題のファイルがバックアップかどうかを簡単に知ることができるので、追加することをお勧めします。これは安全のためだけのものです。このディレクトリに他のファイルを絶対に入れない場合(たとえば、長期間バックアップコピーを保持したい場合)、そのファイルは必要ありません。

  6. -e#!/bin/sh -eスクリプトが最初のエラーで停止するように、hash bang()にオプションを追加することをお勧めします。スクリプトの実行時にエラーが発生するが表示されない場合があります。

おすすめ記事