스크립트 작성 도움말

스크립트 작성 도움말

저는 현재 다음과 같은 목표를 가지고 스크립트를 작성 중입니다.

  1. 스크립트는 15분마다 디렉토리 AppA.log4에 존재하는지 확인합니다 /logs. 디렉토리에는 많은 애플리케이션이 있습니다 . /logs예를 들어 AppA.log4,AppB.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

관련 정보