• ベストアンサー

ファイル数を見て削除するシェルプログラム

mysql のデータベースを mysqldump で取得して そいつを日付のファイル名をつけてバックアップを取っているのですが このままだとひたすら数が増え続けてしまいます。 ファイル数を決めておいて、ある一定数になれば古いものから削除していくような プログラムを書きたいのですが… ちなみにファイルは一つのディレクトリにあり db-20050101.tar.gz のようなフォーマットです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

以下のようなスクリプトを実行してください。 ------------------------- #!/usr/bin/sh # loopcnt=0 zanfile=10 filelist=`ls -r db-????????.tar.gz` # 削除対象ファイルの一覧取得 for delfname in $filelist; do if [ $loopcnt -ge $zanfile -a -f $delfname ]; then rm -f $delfname || exit 10 # ファイル削除 #echo "$delfname was deleted!" fi loopcnt=`expr $loopcnt + 1` done # # 正常終了 # exit 0 ------------------------- shのパスはあなたのマシンの環境にあわせてください。 zanfile=10が残すファイルの数です。適切な数値をセットして下さい。 必ず削除対象ファイルが存在するディレクトリで実行して下さい。 実行してないので自信なし。

その他の回答 (2)

  • dixilo
  • ベストアンサー率0% (0/1)
回答No.2

Unix系のOSでしたら、findコマンドに一定期間以前に更新や、一定期間以内の更新などのファイルのみを出力するオプションがあります。 これを利用すれば、数行のシェルスクリプトで事足りると思われます。 趣旨がずれていたらごめんなさい><

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

perlは、使える環境でしょうか? perlで作ってみました。 残す数は適宜変更して下さい #!/usr/bin/perl @fileList=glob("db-*.tar.gz");#対象ファイルのリストアップ @fileList=(reverse(sort(@fileList)))[6 .. @fileList];#最新の6コ以外のファイルのリストにする for(@fileList){ unlink ; }

takizawa-777
質問者

補足

一連の処理をsh でやっているので できれば sh のcronで完結したいなぁと思ってるのですが…

関連するQ&A