저는 현재 다음과 같은 목표를 가지고 스크립트를 작성 중입니다.
- 스크립트는 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