찾기: "디렉토리가 비어 있지 않습니다"를 억제합니다.

찾기: "디렉토리가 비어 있지 않습니다"를 억제합니다.

2주 이상 전에 마지막으로 수정된 숨기지 않은 파일과 디렉터리를 모두 삭제하려면 다음을 사용합니다.

find ~ -mindepth 1 -mtime +14 -name "[!.]*" -delete

때때로 "디렉토리가 비어 있지 않습니다"라는 오류 메시지가 인쇄됩니다.

find나는 이러한 오류를 제거하고 싶지만(cronjob으로 실행할 때 오류에 대한 알림을 받기 때문에) 디렉토리가 비어 있고 2주 이상 지난 경우에도 오류를 삭제 하고 싶습니다 .

답변1

비표준 확장을 find지원하는 -maxdepth경우 아마도 그렇게 할 수도 있으므로 다음과 같이 할 수 있습니다.-delete-empty

find ~ -mindepth 1 -mtime +14 ! -name '.*' \( ! -type d -o -empty \) -delete

(즉, 빈 디렉토리만 삭제하려고 시도하십시오)

이는 파일이 포함된 디렉터리 이전에 파일을 삭제하려는 경우를 -delete의미합니다 .-depth

그러나 디렉터리에서 파일을 삭제하면 디렉터리의 수정 시간이 업데이트됩니다. 즉, 디렉터리에 성공적으로 삭제된 오래된 파일이 포함되어 있으면 해당 파일 자체가 원래 오래되었더라도 삭제되지 않습니다.

여기서는 디렉토리를 삭제하고 싶지 않을 것입니다.

find ~ -mtime +14 ! -name '.*' ! -type d -delete

또는 파일을 삭제하기 전에 이전 디렉터리 목록을 기록하고 디렉터리가 아닌 파일을 삭제한 다음 기록된 목록에서 디렉터리를 삭제합니다.

tmp=$(mktemp) &&
{
  rm -f -- "$tmp"
  find ~ -depth -mindepth 1 ! -name '.*' -mtime +14 -type d -print0 >&3
  find ~ -mtime +14 ! -name '.*' ! -type d -delete
  xargs -r0 rmdir <&4 2> /dev/null
} 3> "$tmp" 4< "$tmp"

또는 다음을 사용하십시오 moreutils sponge(이것은 전체 파일 목록을 메모리에 저장하는 것을 의미하지만):

 find ~ -depth -mindepth 1 ! -name '.*' -mtime +14 -type d -print0 |
   sponge sh -c '
     find ~ -mtime +14 ! -name ".*" ! -type d -delete
     xargs -r0 rmdir'

Or zsh=(...)절차적 대체 형식 :

{
  find ~ -mtime +14 ! -name ".*" ! -type d -delete
  xargs -r0 rmdir
} < =(find ~ -depth -mindepth 1 ! -name '.*' -mtime +14 -type d -print0)

또는 오래되었는지 여부에 관계없이 모든 빈 디렉토리를 삭제할 수 있습니다.

find ~ -mindepth 1 ! -name '.*' \( -mtime +14 ! -type d -o -type d -empty \) -delete

관련 정보