파일 세트에서 최신 파일을 찾고 zsh 스크립트에서 이전 파일을 삭제하는 방법은 무엇입니까? [복사]

파일 세트에서 최신 파일을 찾고 zsh 스크립트에서 이전 파일을 삭제하는 방법은 무엇입니까? [복사]

zsh 스크립팅에 문제가 있습니다. 다음과 같은 디렉토리에 파일 세트가 있습니다.

001_20160223.txt  /delete
001_20161102.txt  /delete
001_20161209.txt  /keep
005_20160502.txt  /delete 
005_20161105.txt  /delete
005_20161206.txt  /keep
009_20160502.txt  /delete
009_20161105.txt  /delete
009_20161205.txt  /keep

이제 동일한 시작 번호로 파일을 정렬해야 합니다. 001 그런 다음 파일 이름에 적힌 날짜를 기준으로 최신 파일을 찾아 오래된 파일을 삭제합니다. 다른 파일에도 동일한 방법을 수행해야 합니다. 따라서 디렉터리의 최종 출력은 다음과 같습니다.

001_20161209.txt  /keep
005_20161206.txt  /keep
009_20161205.txt  /keep

지금까지 시도한 내용은 다음과 같습니다.

files=($(find . -name "???_*.txt")) | if ((#files > 1)); then rm -- ${files[1,-2]}; fi

하지만 마지막 파일을 제외한 모든 파일이 삭제됩니다. 동일한 시작 이름으로 별도의 파일 세트를 만든 다음 삭제하고 싶습니다.

답변1

sort --reverse최신 파일이 항상 동일한 접두어를 가진 파일 블록의 첫 번째 파일이 되도록 파일 순서를 반대로 바꿀 수 있습니다( ). 그런 다음 현재 블록(사용됨)을 추적 $current_prefix하고 각 블록의 첫 번째 파일( continue)과 rm해당 블록의 다른 모든 파일을 유지할 수 있습니다.

current_prefix=
find . -name '???_*.txt' | sort --reverse | while read line; do
  if [[ ${line[1,5]} != $current_prefix ]]; then
    # we are at the beginning of a new block
    current_prefix=${line[1,5]}
    continue # actually not needed b/c there is nothing outside the if block.
  else
    rm -- $line
  fi
done

참고: 이를 먼저 테스트하려면 rm모든 명령 앞에 echo.

보관하려는 파일만 나열하려면 sort다음을 사용할 수 있습니다 uniq.

find . -name '???_*.txt' | sort --reverse | uniq --check-chars 3

관련 정보