Unix全般 -> シェル -> Bash

ファイルのバージョン管理

仕様

管理対象のファイルを以下の仕様で、バージョン管理する。

ファイル名.バージョン(n)
例)
access_log   => access_log.1
access_log.1 => access_log.2
access_log.2 => access_log.3
access_log.3 => access_log.4

途中でバージョンがかけている場合は以下の通り
例)access_log.3がない場合.3以下のファイルのみバージョン番号を増やす
access_log   => access_log.1
access_log.1 => access_log.2
access_log.2 => access_log.3
access_log.4 => access_log.4 そのまま
access_log.5 => access_log.5 そのまま

シェルスクリプト

#!/bin/sh

DIR=/var/backup/log

LOG_DIR=/var/apache2/logs
FILE=access_log

if [ -f "${DIR}/${FILE}" ]; then
  # NUM
  # ファイルのバージョン番号のみ全て抽出する。
  # バージョン番号はファイル名の最後のドット(.)で区切られている
  # 数値以外の文字が含まれている場合は無視する。
  NUM=`ls ${DIR}/${FILE}.* 2> /dev/null | awk -F"." '{print $NF}' | \
         awk '$1 !~/[^0-9]/' | sort -n`

  # CUR_CNT
  # 連続しているバージョン番号の最大値を算出する
  # NULL値、最初のバージョン番号が.1でない場合は 0 をセットする。
  CUR_CNT=`echo ${NUM} | awk '{x=0;for(i=1;i<=NF;i++)
                             if ((i==1)&&($i!=1)){break}
                             else if(($i+1)!=$(i+1)){x=$i;break}{print x}}'`

  # ファイルのバージョンをカウントアップする
  # バージョン番号の大→小の順番に処理し、最後に最新バージョンを.1 を
  # 処理しループを抜ける。
  while [ 1 ]; do
    if [ ${CUR_CNT} -ge 1 ]; then
      mv ${DIR}/${FILE}.${CUR_CNT} ${DIR}/${FILE}.`expr ${CUR_CNT} + 1`
    else
      mv ${DIR}/${FILE} ${DIR}/${FILE}.1
      break
    fi
    CUR_CNT=`expr ${CUR_CNT} - 1`
  done
fi

cp -p ${LOG_DIR}/${FILE} ${DIR}/${FILE}
awk のフィールド数制限
awk のフィールド数が100を超えるとエラーになるので上記の場合
最大99世代迄しか対応できない。
それ以上に対応する場合は awk を  nawk に変更すればほぼ無限迄対応できる。


      Document-Folder          一覧
HP-UX
HULFT
JAVA
JP1
JavaScript
Linux
MAC
PHP
Perl
Python
Ruby
SOA
Solaris
Unix全般
Windows
XML
エクセル
スタイルシート
セキュリティー
データベース
ネットワーク
パソコン
ブラウザ
プログラム構文
仮想化
          RSS-Folder
ニュース
   アットマーク・アイティ(@IT)
   シンクイット(ThinkIT)
   インターネットコム
   インターネットウォッチ
   日経IT-Pro
   日経パソコン
   CNET Japan
   ZD-NetJapan
   MYCOM
   RBB-Today
ベンダー
   日本IBM
   日本HP
   サンマイクロシステムズ
   NEC
   富士通
   日立
ソフトウェア
   マイクロソフト
   トレンドマイクロ
   オラクル
   サイボウズ
   Mozilla
   野村総合研究所
   (その他ソフトウェア企業)
更新履歴 一覧
 07/08 PERF
プログラム構文
 07/07 PERF
プログラム構文
 06/25 オブジェクトプログラミング2
Perl>サンプル
 07/12 クローン作成
仮想化>vCenter
 07/12 vyatta設定
ネットワーク>vyatta
 07/12 vyattaインストール
ネットワーク>vyatta
 07/12 リポジトリサーバ
Linux>サーバ構築
 07/05 VMwareのインストール
仮想化>VMware
 07/05 PXEブート
仮想化>KVM
 07/01 DHCPでのPXEブート
仮想化>KVM
 06/27 qcow2仮想DISK作成
仮想化>KVM
 06/13 NWの設定
仮想化>VMwareEsxi
 06/13 IPアドレスの変更
仮想化>VMwareEsxi
 06/12 自動ssh
Unix全般>シェル>Bash
 06/12 diffプログラミング
Python
Google