파일 찾기 및 목록 전체에서 x 제거

파일 찾기 및 목록 전체에서 x 제거

특정 디렉터리의 모든 로그 파일을 삭제하고 싶지만 최신 로그 파일은 삭제하고 싶지 않습니다. 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가 아닌 일반 파일만 찾습니다 . 우리는 파일을 나이의 오름차순으로 정렬 .하고 싶습니다 ( 이와 같이 수정 시간을 기준으로 ).omls -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동의하는 경우 모든 줄을 삭제(예: dGvim 명령 사용)한 다음 나가면 해당 줄이 삭제됩니다.

vidirfrom은 moreutils디렉토리용 프로젝션 편집기입니다(디렉토리 내용을 보고, 이름을 바꾸고, 삭제하는 데 가장 적합한 도구).

답변3

이렇게 하면 최신 파일을 제외한 모든 파일의 목록이 제공되며 limit_files나중에 삭제할 수 있습니다.

FileList=`ls -1rt ${ZK_PATH}/*log* | head -${limit_files}`
rm $FileList

공백이나 기타 특수 문자가 포함된 파일에서는 작동하지 않지만 내 로그 디렉터리의 로그 파일에는 영숫자 문자, 대시 및 마침표만 포함되어 있으므로 완벽하게 작동합니다.

관련 정보