我目前正在编写脚本,目标如下:
- 脚本将每 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
后缀标志并处理索引.txt直接从gzip
没有任何循环
cd "$APPLOGS_DIR" && \
gzip -S .${TIMESTAMP}.gz $(cat $OLDPWD/index.txt) && \
mv -f *.${TIMESTAMP}.gz "$BACKUP_DIR"
答案2
我修改了您提供的内容以添加 for 循环,您可以在其中指定各种日志前缀。这假设您每 15 分钟从作业调度程序(例如 cron 或 autosys)调用此脚本,如果没有,则可以将其包装在 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