私は現在、次の目標を持ってスクリプトを書いています。
- スクリプトは、15分ごとにディレクトリ
AppA.log4
に存在することを確認します/logs
。ディレクトリには多くのアプリケーションがあります。/logs
たとえばAppA.log4
、AppB.log4
AppC.log4
- その場合は、
AppA.log4
名前を次のように変更してください。AppA.log.<timestamp>
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