/home 디렉토리에서 100MB가 넘는 파일을 찾아 10일이 넘으면 삭제하는 찾기 스크립트가 있습니다. cron 작업을 통해 매일 예약됩니다.
find /home/ -mtime +10 -type f -size +100M -delete >/dev/null 2>&1
이제 이 스크립트를 사용하면 빈 디렉터리가 남으므로 파일이 삭제된 디렉터리를 반복적으로 삭제하게 되기를 원합니다.
누구든지 이 스크립트에 어떤 변경이 필요한지 제안하거나 제안할 수 있습니까?
답변1
GNU 시스템에서는 다음을 수행할 수 있습니다.
find /home/ -mtime +10 -type f -size +100M -delete -printf '%h\0' |
awk -v RS='\0' '!seen[$0]++ {out = out $0 RS}
END {printf "%s", out}' |
xargs -r0 rmdir
우리는 awk
순서를 유지하면서 중복 파일을 필터링하고(해당 파일이 있는 분기 이전에 남겨두기) rmdir
빈 디렉터리를 제거할 수 있도록 모든 파일이 제거될 때까지 인쇄를 지연했습니다.
그리고 zsh
:
files=(/home/**/*(D.LM+100m+10od))
rm -f $files
rmdir ${(u)files:h}
이렇게 하면 디렉토리가 삭제되고 비어 있게 됩니다.문서그러나 이 디렉터리의 상위 디렉터리는 삭제할 파일이 없고 다음으로 인해 비어 있는 경우 삭제되지 않습니다.목차제거되었다. 이들도 제거하려면 GNU 를 사용 rmdir
하여 .-p
--parents
rmdir
파일이나 디렉토리가 제거되었는지 여부에 관계없이 여전히 GNU를 사용하여 빈 디렉토리를 모두 제거하려면 find
다음을 수행할 수 있습니다.
find /home/ \( -mtime +10 -type f -size +100M -o -type d -empty \) -delete
답변2
이후 두 번째 실행에서는 빈 디렉터리를 모두 삭제할 수 없습니다( find
옵션 -empty
?-type d
답변3
cd "/home" && \
find . -depth -type d ! -name . ! -empty -exec sh -c '
find "$1" -mtime +10 -type f -size +100M -delete
' {} {} \; -empty -delete
일반화하다
위의 작업을 수행하려면 GNU find가 필요합니다. 기본 아이디어는 하위 디렉토리가 상위 디렉토리보다 먼저 처리되도록 하는 패턴을 사용하는 find
것 입니다. 그런 다음 디렉터리와 비어 있지 않은 디렉터리만 살펴보므로 원래 비어 있던 디렉터리가 삭제되는 것을 방지할 수 있습니다.-depth
find
find