![누적 크기가 xGB를 초과하는 경우에만 디렉터리의 파일을 삭제하세요.](https://linux55.com/image/195786/%EB%88%84%EC%A0%81%20%ED%81%AC%EA%B8%B0%EA%B0%80%20xGB%EB%A5%BC%20%EC%B4%88%EA%B3%BC%ED%95%98%EB%8A%94%20%EA%B2%BD%EC%9A%B0%EC%97%90%EB%A7%8C%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EC%9D%98%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%82%AD%EC%A0%9C%ED%95%98%EC%84%B8%EC%9A%94..png)
수천 개의 파일이 포함된 디렉토리가 있습니다.
최신 파일이 삭제되지 않도록 생성 날짜의 내림차순으로 파일을 정렬하고 합계가 특정 제한(예: 10GB)에 도달할 때까지 이러한 파일의 크기를 합산해야 합니다.
이 목표가 달성되면 모든 파일을 삭제할 수 있어야 합니다(이미 내림차순으로 정렬되어 있음).그 10GB 파일 이후.
그런 다음 실행한 후 내 디렉토리의 내용은 다음과 같아야 합니다.10GB 이하전체 크기이지만 최신 파일을 보관해야 합니다.
나는 이 일을 완수할 수 있어야 해요GAWK를 사용하지 않음GNU 시스템이 없기 때문입니다.
명령만으로 이것이 가능 합니까 find
?
답변1
그리고 zsh
그리고st_blocks
시스템 호출에 의해 반환된 속성이 lstat()
512바이트 단위로 표현되는 시스템 및 파일 시스템에서(대부분):
#! /usr/bin/env zsh
zmodload zsh/stat || exit
zmodload zsh/files || exit # for a builtin rm as well.
disk_usage=0 threshold=$(( 10 * 2**30 ))
set -- **/*(ND.om)
for f do
stat -LA blocks +block -- $f &&
(( (disk_usage += blocks * 512) > threshold )) &&
break
shift
done
(( $# == 0 )) || print -r rm -f -- "$@"
( print -r
실제 수행된 작업 제거)
누적 디스크 사용량에서는 일반 파일만 계산됩니다. 동일한 파일에 대한 하드 링크가 여러 개 있는 경우 해당 크기도 계산됩니다.