スクリプト作成ヘルプ

スクリプト作成ヘルプ

私は現在、次の目標を持ってスクリプトを書いています。

  1. スクリプトは、15分ごとにディレクトリAppA.log4に存在することを確認します/logs。ディレクトリには多くのアプリケーションがあります。/logsたとえばAppA.log4AppB.log4AppC.log4
  2. その場合は、AppA.log4名前を次のように変更してください。AppA.log.<timestamp>
  3. zipファイル名を変更して次の場所に移動します。/backupDIR

これまで作業スクリプトを作成しましたが、ハードコードされています。

よりダイナミックにするために改善するのに役立ちますか?たとえば、AppA.log4およびはAppB.log4 移動して圧縮され、ディレクトリAppC.log4に残ります。/logs

スクリプトが読み取るすべてのアプリケーション(および)を一覧表示する別のファイルがある場合はAppAどうなりますか?AppBここにどのように適用しますか?よろしくお願いします。

TIMESTAMP=`date "+%Y.%m.%d-%H.%M"`
LOGS="AppA.log.4"
APPLOGS_DIR="/logs/"
BACKUP_DIR="/backupDIR/"

cd $APPLOGS_DIR;

if [ -f "$LOGS" ];
then
        mv $LOGS $BACKUP_DIR;
                cd $BACKUP_DIR;
                mv $LOGS AppA_$TIMESTAMP;
        gzip AppA_$TIMESTAMP;
else
    echo "No log file to be backed up"
fi

答え1

forループを使用して使用できます文字列演算${var%.*}入力ファイル名に基づいて出力ファイル名を生成する

TIMESTAMP=$(date "+%Y.%m.%d-%H.%M")
APPLOGS_DIR="./logs"
BACKUP_DIR="./backupDIR"

# canonicalize relative paths
APPLOGS_DIR=$(realpath "$APPLOGS_DIR")
BACKUP_DIR=$(realpath "$BACKUP_DIR")

# delete this line - just for demo
echo "AppA.log.4\nAppB.log.4" >> ./index.txt

# read file names from list
LOGS=$(sort ./index.txt | uniq) || exit 127

cd "$APPLOGS_DIR" || exit 127

for log in $LOGS
  do
    if [ -f "$log" ]
      then
        mv -f $log "$BACKUP_DIR"
        cd "$BACKUP_DIR" || exit 127
        mv $log ${log%.*}_${TIMESTAMP}
        gzip ${log%.*}_${TIMESTAMP}
        cd "$APPLOGS_DIR"
      else
        echo "No log file to be backed up"
    fi
done

ただし、ファイルをアーカイブして削除するだけです。cd

while IFS='' read -r log || [ "$log" ]
  do
    [ -f "$APPLOGS_DIR/$log" ] && \
    gzip -nc "$APPLOGS_DIR/$log" > "$BACKUP_DIR/${log%.*}_${TIMESTAMP}.${log##*.}.gz" && \
    rm "$APPLOGS_DIR/$log" || \
    echo "No '$log' file to be backed up"
done <<< $(sort ./index.txt | uniq)

または、単一行として(出力ファイル名が重要ではなく、ファイル名にスペースが含まれていない場合)、-Sサフィックスフラグを使用して処理します。index.txtgzipすべてのループから直接

cd "$APPLOGS_DIR" && \
gzip -S .${TIMESTAMP}.gz $(cat $OLDPWD/index.txt) && \
mv -f *.${TIMESTAMP}.gz "$BACKUP_DIR"

答え2

さまざまなログプレフィックスを指定できるforループを追加するために提供した内容を修正しました。これは、cronやautosysなどのジョブスケジューラで15分ごとにこのスクリプトを呼び出すと仮定します。そうでない場合は、while trueループでラップして15分間休止することができます。

TIMESTAMP=`date "+%Y.%m.%d-%H.%M"`
LOGS="AppA AppB"
# to pull log prefixes from a file replace with the next line
#LOGS="$(cat prefixes.txt)"
LOGSUFFIX=".log.4"
APPLOGS_DIR="/logs"
BACKUP_DIR="/backupDIR"

for LOG in ${LOGS}
do
    if [ -f "${APPLOGS_DIR}/${LOG}${LOGSUFFIX}" ]
    then
        mv "${APPLOGS_DIR}/${LOG}${LOGSUFFIX}" "${BACKUP_DIR}/${LOG}_${TIMESTAMP}"
        gzip "${BACKUP_DIR}/${LOG}_${TIMESTAMP}"
    else
        echo "No ${LOG}${LOGSUFFIX} file to be backed up"
    fi
done

関連情報