여러 파일의 이름을 바꾸고, gzip으로 압축한 후 10일이 지난 파일을 삭제하세요.

여러 파일의 이름을 바꾸고, gzip으로 압축한 후 10일이 지난 파일을 삭제하세요.

저는 Linux/Unix를 처음 접했고 단계별로 배우고 있습니다. 안타깝게도 오늘 면접에서 (확실히 몰랐던) 해야 할 일이 있어서 깜짝 놀랐습니다. Bash 스크립트를 준비하라는 요청을 받았습니다.

  • .log의 이름을 변경합니다. 파일을 (이름).(날짜).log.(원래 이름의 나머지 부분)에 저장하고 .gz 아카이브로 gzip합니다.

  • 10일이 지난 (이름).(날짜).log.(원래 이름의 나머지 부분).gz 파일을 삭제합니다.

물어봐도 너무 늦지 않았습니다. 어떻게 생겼는지 알려주시면 감사하겠습니다.

답변1

GNU 도구를 사용한다고 가정하면 다음과 같은 작업을 수행합니다.

find . -type f \( -name '*.[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9].log.*.gz' \
       \( -mtime -10 -o -delete -o -true \) -o -name '*.log.*' ! -name '*.gz' \
       \( -mtime +9 \( -delete -o -true \) -o -printf '%TF/%p\0' \) \) |
  while IFS=/ read -rd '' date file; do
    basename=${file##*/}
    dirname=${file%/*}
    newfile=$dirname/${basename%.log.*}.$date.log.${basename##*.log.}
    mv "$file" "$newfile" && gzip "$newfile"
  done

답변2

#!/bin/bash

workdir="/tmp/myfilestomove"
#cd "$workdir"
[ ! -e "$workdir" ] && exit 

find -type f "$workdir" | grep -v '.gz' | while read file; do
     filedate="$(date -r "$file" +%d%m%Y)"
     basename="${file%.*}"
     extension="${file##*.}"
     echo mv "$file" "${basename}.${filedate}.${extension}" 
     echo gzip "${basename}.${filedate}.${extension}"
done


find -type f -mtime +10 "$workdir" | while read file; do
     echo rm "$file"
done

스크립트를 테스트한 경우에만 echo를 제거하고 처음 사용하기 전에 파일을 백업하십시오.

관련 정보