Bash

#!/bin/sh

#########################################################################

# 作成日: 2014/9/11

# 作成者: hidaka

# ファイル情報収集シェル

#

# ★シェル内容

# パーミッション、ユーザーグループ、ファイル名(フルパス)のみ収集する

#

# 第1引数:指定した階層分だけファイル情報を収集する(1 ~ 99)

# 第2引数:all もしくは check オプション

#

# 第2引数にcheckオプションを付けると第4引数で指定したファイルタイプ

# のみ収集する ( "ldbcs" の中で任意の文字列を指定)

#

# 例:第4階層までのシンボリックリンクとディレクトリのみ収集

# ./file_collect.sh 4 check ld hogehoge.log

#

# allオプションの場合は全ディレクトリが対象となる

#

# 末尾の引数:保存ファイル名を指定する。指定がない場合は以下のファイル名

# <ホスト名>_<yyyymmddHHMMSS>_fileinfo_all(またはcheck).log

#

# ★エラーコード(戻り値)の説明

# 3: 第1引数エラー

# 5: 第2引数エラー

# 10: メイン処理後、ファイルが見つからない状態

# 15: sedのピリオド整形処理が異常終了している

# 20: sedの空白行整形処理が異常終了している

# 25: checkオプションで指定する第3引数のエラー

# 30: 直前のgrepかrenameコマンドが異常終了している

#

##########################################################################

##### 変数定義

# カレントを実行ディレクトリにする
WORKDIR=`pwd`

# 整形に利用する一時ファイル名を定義
TMPLOG=tmp.$$
TMPLOG2=tmp2.$$

# 自身のシェル名を定義
MYSCRIPT=`basename $0`

# 第1引数チェック
if [[ $1 -ge 1 && $1 -le 99 ]] ; then

	echo '$1 check OK!'
	else
	logger "$MYSCRIPT" 'ERROR!' 'EXIT No: 3'
	echo 'error! No' '$1 option is min:1 max:99' ; exit 3

fi

###### 保存ファイル名定義

# 環境変数を引き継がない様に空にしておく
FILENAME=""

# allオプションの場合の変数定義
if [[ all = $2 ]] ;then

	FILENAME=$3
	if [[ "" = $3 ]] ; then
		# 保存ファイル名の指定が無かった場合は自動作成
		FILENAME=`uname -n`_`date +%Y%m%d%H%M%S`_fileinfo_all.log
	fi

fi

# checkオプションの場合の変数定義
if [[ check = $2 ]] ; then

	FILENAME=$4
	if [[ "" = $4 ]] ; then
		# 保存ファイル名の指定が無かった場合は自動作成
		FILENAME=`uname -n`_`date +%Y%m%d%H%M%S`_fileinfo_check.log
	fi

fi

##### 収集対象ディレクトリを定義
if [[ all = $2 ]] ; then

	# allオプションがある場合は全ディレクトリから収集
	FIND_DIR=`ls -1 /`
	# allオプションが無い場合は'proc' 'sys' 'dev' ディレクトリ を除外する

# 仮想ファイルシステムはシステムの利用状況に応じて変化する為

# 設計書にも普通は記載が無い(ていうか定義できない)

	elif [[ check = $2 ]] ; then
	FIND_DIR=`ls -1 / | grep -iEv 'proc|sys|dev'`
	else
	echo error! invalid argument \"$2\" 
	logger "$MYSCRIPT" 'ERROR!' 'EXIT No: 5'
	echo '"$2"' 'invalid argment.' 'option is "all" or "check"' ; exit 5

fi

##### メイン処理
logger '##########' "$MYSCRIPT" 'START!' '##########'

# 第1引数で指定した階層までファイル情報を収集する
for i in $FIND_DIR
do

	# find -exec ls -ldだと処理が遅いのでxargsに渡すよう変更
	find /$i -maxdepth $1 -print0 | xargs -0 ls -ld >> $WORKDIR/$TMPLOG

done

##### 整形処理
if [[ -f $WORKDIR/$TMPLOG ]] ; then

	# Selinuxの属性で付与されるピリオド'.'を除外
	sed -i -e 's/\. / /' $WORKDIR/$TMPLOG

else

	logger "$MYSCRIPT" 'ERROR!' 'EXIT No: 10'
	echo error! No "$?" ; exit 10

fi

if [[ 0 -eq $? ]] ; then

       # 連続した空白を1つに纏める 
       sed -i -e 's/ * / /g' $WORKDIR/$TMPLOG
	else
	logger "$MYSCRIPT" 'ERROR!' 'EXIT No: 15'
	echo error! No "$?" ; exit 15

fi

if [[ 0 -eq $? ]] ; then

	# checkオプションの場合
	if [[ check = $2 ]] ; then
		# ファイル名以外の区切り文字をカンマに置換
		sed -i -e 's/\ /\,/' $WORKDIR/$TMPLOG
		sed -i -e 's/\ /\,/' $WORKDIR/$TMPLOG
		sed -i -e 's/\ /\,/' $WORKDIR/$TMPLOG
		sed -i -e 's/\ /\,/' $WORKDIR/$TMPLOG
		sed -i -e 's/\ /\,/' $WORKDIR/$TMPLOG
		sed -i -e 's/\ /\,/' $WORKDIR/$TMPLOG
		sed -i -e 's/\ /\,/' $WORKDIR/$TMPLOG
		sed -i -e 's/\ /\,/' $WORKDIR/$TMPLOG
		sed -i -e 's/\ /\,/' $WORKDIR/$TMPLOG
		

# allオプションの場合は/dev配下も収集対象なので

		# キャラクタデバイスの整形処理が必要
		else
		sed -i -e 's/, //' $WORKDIR/$TMPLOG
		# ファイル名以外の区切り文字をカンマに置換
		sed -i -e 's/\ /\,/' $WORKDIR/$TMPLOG
		sed -i -e 's/\ /\,/' $WORKDIR/$TMPLOG
		sed -i -e 's/\ /\,/' $WORKDIR/$TMPLOG
		sed -i -e 's/\ /\,/' $WORKDIR/$TMPLOG
		sed -i -e 's/\ /\,/' $WORKDIR/$TMPLOG
		sed -i -e 's/\ /\,/' $WORKDIR/$TMPLOG
		sed -i -e 's/\ /\,/' $WORKDIR/$TMPLOG
		sed -i -e 's/\ /\,/' $WORKDIR/$TMPLOG
		sed -i -e 's/\ /\,/' $WORKDIR/$TMPLOG
	fi		
	else
	logger "$MYSCRIPT" 'ERROR!' 'EXIT No: 20'
	echo error! No "$?" ; exit 20

fi

# 使わない情報を除外

# パーミッション、ユーザー・グループ、ファイル名(フルパス)以外は収集しない
if [[ $? -eq 0 ]] ; then

	awk -F, '{print $1 " " $3 " " $4 " " $10}' $WORKDIR/$TMPLOG > $WORKDIR/$TMPLOG2
	else
	logger "$MYSCRIPT" 'ERROR!' 'EXIT No: 23'
	echo error! exit No "$?" ; exit 23

fi

# chek オプションありの場合は任意のファイルタイプのみ収集する

# オプション無しの場合は全ファイルタイプを収集
if [[ check = $2 ]] ; then

	if [[ "" = $3 ]] ; then
		logger "$MYSCRIPT" 'ERROR!' 'EXIT No: 25'
		echo error! invalid argument \"$3\" ; exit 25
		else
		# 第3引数で指定したファイルシステムタイプのみ収集する
		grep  ^[$3] $WORKDIR/$TMPLOG2 > $WORKDIR/$FILENAME
	fi
	else
	# allオプションの場合はrenameコマンドでファイル名を変更する
	/usr/bin/rename $WORKDIR/$TMPLOG2 $WORKDIR/$FILENAME $WORKDIR/$TMPLOG2

fi

# 終了処理
if [[ 0 -eq $? ]] ; then

	# 一時ファイルを削除
	/bin/rm $WORKDIR/$TMPLOG $WORKDIR/$TMPLOG2 > /dev/null 2>&1 
	echo $MYSCRIPT sccess!
	echo making file is' :' `ls -l $WORKDIR/$FILENAME | grep $FILENAME | awk '{print $5 " Byte " "FILENAME: " $10}'`

logger '##########' "$MYSCRIPT" 'FINISH!' '##########'

	# 戻り値を 0 にして正常終了
	exit 0

else

	# 1つ前のコマンドが失敗した場合は戻り値30で異常終了を知らせる
	echo 'command ERROR!' "No $?"
	/bin/rm $WORKDIR/$TMPLOG $WORKDIR/$TMPLOG2
	logger "$MYSCRIPT" 'ERROR!' 'EXIT No: 30'
	exit 30

fi

##### 以上


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-09-22 (月) 11:54:21 (1879d)