특정 디렉터리의 모든 로그 파일을 삭제하고 싶지만 최신 로그 파일은 삭제하고 싶지 않습니다. 3.
나는 그것을 완료했습니다:
DATA_PATH=$(gadmin config get System.DataRoot)
ZK_PATH=${DATA_PATH}/zk/version-2
log_count=$(ls -ltrh ${ZK_PATH} | grep log | wc -l)
limit_files=`expr $log_count - 3`
echo There is ${log_count} files found in ${ZK_PATH}, ${limit_files} will be deleted, here the list:
ls -ltrh ${ZK_PATH} | grep log | head -${limit_files}
while true; do
read -p "Are you sure to delete these files? " yn
case $yn in
[Yy1]* ) echo execute to delete the files; break;;
[Nn0]* ) exit;;
* ) echo "Please answer y or n.";;
esac
done
나열된 12개 파일 중 9개를 어떻게 삭제합니까?
먼저 목록을 파일로 인쇄한 다음 루프를 사용하여 하나씩 제거하는 것을 고려했지만 단 한 줄로 이 작업을 수행할 수 있는 코드가 있을 것이라고 확신합니다.
find ... -delete
, -exec
및 를 사용해 보았 xargs rm
으나 제대로 인식하지 못했습니다.
어떻게 해야 합니까?
답변1
이러한 종류의 작업은 bash 대신 zsh를 사용하여 더 쉽고 안정적으로 수행할 수 있습니다.
#! /bin/zsh -
data_path=$(gadmin config get System.DataRoot) || exit
zk_path=$data_path/zk/version-2
keep=3
files=( $zk_path/*log*(N.om) )
if (( $#files > keep )); then
printf >&2 '%s\n' "$#files files found in $zk_path, $(( $#files - keep )) will be deleted, here is the list from newest to oldest:"
shift keep files
printf >&2 ' - "%s"\n' $files:t
read -q '?OK to delete? ' && rm -f -- $files
fi
특히 흥미로운 점은$zk_path/*log*(N.om)
전반적인 상황*log*
; 패턴과 일치하는 모든 파일 이름 으로 확장되고 $zk_path
대괄호는 (…)
파일을 찾을 수 없는 경우 오류가 없음을 지정합니다( ullglob ). 디렉터리, 심볼릭 링크, 장치...( ) N
가 아닌 일반 파일만 찾습니다 . 우리는 파일을 나이의 오름차순으로 정렬 .
하고 싶습니다 ( 이와 같이 수정 시간을 기준으로 ).o
m
ls -t
답변2
비슷한 상황에서 나는 다음 접근 방식을 사용했습니다. (아마도 이것이 가장 강력한 솔루션은 아니지만 일반적인 상황에서는 여전히 유용할 수 있습니다...)
LOGDIR=my/logs ##
ls -dpt -- "$LOGDIR"/log* | # get log files sorted by date
grep -v '/$' | # but remove directories/ from the list
tail -n +4 | # remove also the newest 3
vidir -
에서 vidir
동의하는 경우 모든 줄을 삭제(예: dG
vim 명령 사용)한 다음 나가면 해당 줄이 삭제됩니다.
vidir
from은 moreutils
디렉토리용 프로젝션 편집기입니다(디렉토리 내용을 보고, 이름을 바꾸고, 삭제하는 데 가장 적합한 도구).
답변3
이렇게 하면 최신 파일을 제외한 모든 파일의 목록이 제공되며 limit_files
나중에 삭제할 수 있습니다.
FileList=`ls -1rt ${ZK_PATH}/*log* | head -${limit_files}`
rm $FileList
공백이나 기타 특수 문자가 포함된 파일에서는 작동하지 않지만 내 로그 디렉터리의 로그 파일에는 영숫자 문자, 대시 및 마침표만 포함되어 있으므로 완벽하게 작동합니다.