帮助创建脚本

帮助创建脚本

我目前正在编写脚本,目标如下:

  1. 脚本将每 15 分钟检查一次目录AppA.log4中是否存在/logs。目录中有许多应用程序,/logs例如AppA.log4AppB.log4AppC.log4
  2. 如果有AppA.log4,则将其重命名为AppA.log.<timestamp>
  3. zip重命名的文件并移动到/backupDIR

到目前为止,我已经创建了工作脚本,但它是硬编码的。

您能帮助改进它以使其更加动态吗?例如,AppA.log4AppB.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

相关内容