일반화하다

일반화하다

/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--parentsrmdir

파일이나 디렉토리가 제거되었는지 여부에 관계없이 여전히 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것 입니다. 그런 다음 디렉터리와 비어 있지 않은 디렉터리만 살펴보므로 원래 비어 있던 디렉터리가 삭제되는 것을 방지할 수 있습니다.-depthfindfind

관련 정보