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