모든 오래된 파일, 폴더 및 하위 폴더를 삭제하는 명령

모든 오래된 파일, 폴더 및 하위 폴더를 삭제하는 명령

31일 이상 업데이트되지 않은 모든 파일, 폴더 및 하위 폴더를 삭제하는 명령이 필요합니다. 나는 이것을 시도했다

find . -mindepth 1 -mtime +31 -exec rm -rf "{}" \;

하지만 이런 계층구조가 있다면

.
├── old_sub_folder1
└── old_sub_folder2
    ├── old_file
    └── old_sub_folder3
        └── new_file

이전 폴더\파일은 어디에 old_*있고 new_file새 파일은 어디에 있습니까?

이 명령은 모든 내용을 삭제합니다. 날짜가 생성된 old_sub_folder2후 업데이트되지 않았기 때문입니다 .new_file

old_sub_folder2/old_sub_folder3/new_file을 삭제하지 않는 명령이 필요합니다

답변1

문제는 명령 -r에 옵션을 추가했다는 것입니다 rm. 폴더가 비어 있지 않더라도 폴더가 삭제됩니다.

이 작업은 두 단계로 수행해야 합니다.

  1. 만 삭제오래된 파일:

    find . -type f -mtime +31 -delete

  2. 이전 폴더를 삭제하려면 해당 폴더가 비어 있으면 엿볼 수 있습니다.여기, 그리고 약간 조정하십시오.

    find . -type d -empty -mtime +31 -delete

답변2

find  . -type d ! -name . -mtime +31 -exec sh -c '
   case $(find "$1" ! -mtime +31 -exec echo x \; -prune) in
      "" ) rm -rf "$1" || echo "Error could not delete folder \"$1\"" ;;
   esac
' {} {} \;

현재 디렉토리에서 지난 31일 이후 업데이트되지 않은 항목 find만 시작하고 살펴봅니다 . directories그리고 이러한 각 디렉토리에서 우리는 차례로 31일보다 오래되지 않은 모든 항목을 찾고 이를 찾으면 더미 문자를 에코하고 모든 전방 검색을 정리합니다(이상적으로는 다음을 통해 검색을 종료해야 합니다. 그러나 그것은 그러므로 우리가 만족하는 것이 -quit아닙니다 ).POSIX-prune

그런 다음 이 작업의 결과를 찾고 find비어 있는 것으로 판명되면 단 하나의 요소(파일/디렉터리/링크/등)도 새 것이 아니므로 이 디렉토리가 있음을 알 수 있습니다. 삭제해도 안전합니다.

관련 정보