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

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

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결과가 비어 있으면 하나의 요소(파일/디렉터리/링크/등)도 새로운 것이 아니므로 이 디렉터리라는 것을 알 수 있습니다. 삭제해도 안전합니다.

관련 정보