저는 유닉스를 처음 사용합니다. 여러 작업의 최신 로그를 찾고 최신 로그를 삭제하려고 합니다.
이에 대한 쉘 스크립트를 작성할 수 있습니까? 기본 명령을 사용해 보았지만 시간 범위를 선택하고 로그를 삭제하는 중이지만반품유용한 로그를 삭제하세요.
내가 발견한 내용을 공유합니다:
touch -t 201903281325.00 start
touch -t 201903281331.00 stop
find . -newer start \! -newer stop -type f \( -name "**" -o -name "**" \) -exec rm -f {} \;
해당 시간 내에 모든 파일이 삭제됩니다.
내가 하고 싶은 것:
작업 이름이 A, B, C 등이고 이러한 작업이 하루에 5번 실행된다고 가정합니다(예: A_1, A_2, A_3, B_1, B_2, B_3 등).
오늘 생성된 런닝 로그에 대해 이야기해 보세요.
Order_created_20190611_1.log
Order_created_20190611_2.log
Order_created_20190611_3.log
Order_zip_rec_20190611_1.log
Order_zip_rec_20190611_2.log
자동으로 삭제해야 했던 항목:
Order_created_20190611_3.log
Order_zip_rec_20190611_2.log
자동으로 찾아 삭제하고 Order_created_20190611_3.log
싶습니다 .Order_zip_rec_20190611_2.log
직위의 예:
Order_created
-- 직위20190611
- 실행일_2
(마지막 언급) - 실행 횟수입니다._2
오늘의 달리기는 두 번째라는 뜻이다.
답변1
이와 같은 간단한 파일 이름의 경우 개행 문자와 같은 이상한 문자가 포함되지 않으므로 구문 분석할 수 있습니다 ls
(일반적으로 .권장되지 않음.)
귀하의 질문에 설명된 대로, 우리는 이러한 패턴과 일치하는 파일을 처리한다고 가정합니다. 물론 *
"모든 것"이 일치됩니다.
Order_created_20190611_*.log
Order_zip_rec_20190611_*.log
또한 오늘 날짜를 기준으로 하는 파일의 경우 다음과 같은 "최신" 파일을 찾을 수 있습니다.
# Today's date in YYYYMMDD format
today="$(date +%Y%m%d)"
# Get "ls" to give us the files ordered by date modified (newest first). Pick off the first
newest="$(ls -t "Order_created_${today}_"*".log" | head -n1)"
# Show what we would delete (remove "echo" to action)
echo rm "$newest"
이 원칙을 사용하면 여러 파일 이름에 걸쳐 루프로 롤업할 수 있습니다.
today="$(date +%Y%m%d)"
for prefix in Order_created Order_zip_rec
do
newest="$(ls -t "${prefix}_${today}_"*".log" 2>/dev/null | head -n1)"
[[ -f "$newest" ]] && echo rm "$newest"
done
지침
- 일반적 으로
ls
.sort
find
ls
일치하는 파일이 없는 경우 오류 출력을 포기했습니다.rm
이번에도 삭제할 파일이 있는 경우에만 시도했습니다.
답변2
각 작업 및 날짜 그룹에 대한 "마지막"(가장 높은 번호의 "실행") 로그 파일을 삭제하려면 각 조합에서 표시되는 상위 작업 실행을 추적하고 삭제할 작업을 나열하는 ksh93 기반 솔루션을 사용하는 것이 좋습니다. 파일 수:
#!/bin/ksh93
typeset -A highestjobruns=()
typeset -A deletions=()
for logfile in *_????????_*.log
do
base=${logfile%.log}
run=${base##*_}
jobdate=${base%_?}
if [ -z "${highestjobruns[$jobdate]}" ]
then
# no job runs found yet, this is it; nothing to delete yet
highestjobruns[$jobdate]=$run
else
# if this file has a higher run number, it's the new target for deletion
if [ "$run" -gt "${highestjobruns[$jobdate]}" ]
then
highestjobruns[$jobdate]=$run
deletions[$jobdate]=$logfile
fi
fi
done
printf 'Would rm: %s\n' "${deletions[@]}"
#rm -- "${deletions[@]}"
기본 아이디어는 각 잠재적인 로그 파일을 반복하고(취향에 따라 와일드카드를 조정합니다. "무엇이든", 밑줄, 6자리, 밑줄, "무엇이든", 로 끝나야 함 .log
) 실행 번호와 작업 조합 및 날짜를 선택한 다음, 몇 가지 질문을 해보세요:
- 이 작업의 실행과 날짜 조합을 기록했습니까? 그렇지 않은 경우 이를 문서화하고 계속 진행하세요. 이는 싱글톤 작업 실행을 삭제하지 않음을 의미합니다.
- 이전에 이 직업과 날짜 조합의 실행을 본 적이 있다면 지금 보고 있는 실행이 지금까지 본 최고 실행보다 높습니까? 그렇다면 새 실행 번호를 기록하고 현재 파일을 삭제했을 수 있는 파일로 채웁니다. 동일한 작업 및 날짜에 대한 후속 로그가 이 항목을 덮어쓸 수 있으므로 작업 이름 및 날짜당 하나의 로그 파일만 삭제합니다.
rm
마지막으로 삭제하려는 파일에 대한 예제 명령을 인쇄합니다 . 원하는 경우 주석을 달고 rm
삭제를 위해 실제 명령 자체의 주석을 제거합니다.