会社の業務ではWordPressをウェブサイトに、Redmineを社内のタスク管理に使っている。
業務で使っているからには、システムのバックアップは必須である。
WordPressもRedmineもファイルシステムとデータベースのバックアップさえあれば、別の環境に復元できる。そのため、ファイルシステム全体とデータベースのダンプファイルを圧縮ファイルに固めて、別のマシンに自動でコピーするような仕組みを使った。
この仕組みを作ってから、手動のバックアップから解放された。
放っておいても自動でバックアップが取得されるのである。気分的にもとてもよい。
しかし、気づかないうちにバックアップファイルがどんどん溜まってハードディスクを圧迫してきてしまった。古いバックアップファイルは、手動で削除すればよいのだが・・・。
やはり、エンジニアとしては、そういうところも自動でやってしまいたいものである。
ということで、Rubyを使って古いバックアップファイルを削除するスクリプト(purge.rb)を作成してみた。使い方は下記のとおり、
ruby purge.rb <directory> <generations to be remained> <extension>
- directory: バックアップファイルが保存されているディレクトリーを指定する。
- generations to be remained: 残しておきたい世代を数字で指定する。
たとえば最近の5世代残して、古いものはすべて削除するのであれば"5"と指定する。 - extension: バックアップファイルの拡張子を指定する。例)"zip"
purge.rb
def show_usage puts "Usage: purge.rb" puts " Ex) purge.rb /home/backup/wordpress 7 zip" puts " This command delete zip files except the latest 7 generations." exit end dir = ARGV.shift show_usage unless dir gen = ARGV.shift.to_i show_usage unless gen ext = ARGV.shift show_usage unless ext puts "Target directory: " + dir puts "Generations to be remained: #{gen}" #Store file name and update date to the hash. hash = {} Dir::glob("#{dir}/*.#{ext}").each do |fn| hash[fn] = File::stat(fn).mtime end #Sort array by date. array = hash.to_a.sort{|a,b| b[1] <=> a[1]; } #Delete files except the latest generations. for i in 0..(array.size-1) if i >= gen file = array[i][0] puts "Deleting " + file + " ..." File::delete(file) end end
使用例
$ ls -l total 366460 -rw-r--r-- 1 backup backup 40526207 Sep 20 02:00 wordpress_20100920.zip -rw-r--r-- 1 backup backup 43049695 Sep 27 02:00 wordpress_20100927.zip -rw-r--r-- 1 backup backup 47605291 Oct 4 02:00 wordpress_20101004.zip -rw-r--r-- 1 backup backup 49300621 Oct 11 02:00 wordpress_20101011.zip -rw-r--r-- 1 backup backup 54476254 Oct 18 02:00 wordpress_20101018.zip -rw-r--r-- 1 backup backup 68447805 Oct 25 02:00 wordpress_20101025.zip -rw-r--r-- 1 backup backup 71424873 Oct 28 17:39 wordpress_20101028.zip $ ruby ../bin/purge.rb . 5 zip Target directory: . Generations to be remained: 5 $ ls -l total 366460 -rw-r--r-- 1 backup backup 47605291 Oct 4 02:00 backup_20101004.zip -rw-r--r-- 1 backup backup 49300621 Oct 11 02:00 backup_20101011.zip -rw-r--r-- 1 backup backup 54476254 Oct 18 02:00 backup_20101018.zip -rw-r--r-- 1 backup backup 68447805 Oct 25 02:00 backup_20101025.zip -rw-r--r-- 1 backup backup 71424873 Oct 28 17:39 backup_20101028.zip
5世代を残して、古いzipファイルが削除されているのが分かる。
なお引数なしで実行すると、ヘルプが表示される。










