오류 없이 Linux에서 여러 파일 삭제를 캡처하는 방법은 무엇입니까?

오류 없이 Linux에서 여러 파일 삭제를 캡처하는 방법은 무엇입니까?

디렉터리/파일을 삭제하려면 다음 명령을 사용하고 있습니다. 내가 아는 한, 디렉토리/파일에 액세스 권한이 있거나 다른 문제가 있는 경우 해당 항목을 건너뛰고 나머지 파일은 삭제됩니다.

find $CDIR -mtime +7 -exec rm -rfv {} \;

RETURN_CODE_CLEANUP=$?

이제 일괄삭제 시 오류가 얼마나 발생하는지 확인하고 싶습니다. 나는 RETURN_CODE_CLANUP하나 이상의 오류에 대해 0이 아닐 것이라고 생각합니다 . 이 방법에서 오류를 어떻게 잡을 수 있나요?

답변1

생성된 오류의 정확한 수를 계산하려면 다음을 수행하십시오 rm.

find "$CDIR" -depth -mtime +7 -exec sh -c '
    for pathname do
        if ! rm -rfv "$pathname"; then
           count=$(( count + 1 ))
        fi
    done
    printf "This batch caused %d errors in rm\n" "$count"' sh {} +

$CDIR그러면 하위 디렉터리에 대한 깊이 우선 검색이 수행되고 수정 타임스탬프가 1주일보다 오래된 모든 파일이나 디렉터리가 제거됩니다. 인라인 셸 스크립트가 호출되어 일괄적으로 경로 이름을 찾고 각 경로 이름을 반복하여 rm제거에 실패하면 계산됩니다. 포함된 스크립트가 끝나면 일괄 처리 실패 횟수가 보고됩니다.

이는 매우 위험한 청소 방법이므로 주의하시기 바랍니다.일주일 이내에 파일이나 디렉터리 자체가 추가되거나 제거되지 않으면 루트로 간주되는 전체 디렉터리 구조가 $CDIR삭제됩니다.$CDIR. 의 모든 하위 디렉터리에 동일한 문제가 존재합니다 $CDIR.

이전 것을 삭제하고 싶을 수도 있습니다문서, 삭제비어 있는각 디렉토리:

find "$CDIR" ! -type d -mtime +7 -exec sh -c '
    for pathname do
        if ! rm -fv "$pathname"; then
           count=$(( count + 1 ))
        fi
    done
    printf "%d files in this batch could not be deleted\n" "$count"' sh {} +

find "$CDIR" -type d -empty -delete

(이것은 첫 번째 명령 으로 비어 있지 않은 경우에도 빈 디렉토리를 삭제할 수 있고 find지원하는 -empty구현이 있다고 가정합니다 .)-deletefind

항상 그렇듯이 이러한 유형의 정리를 수행하는 명령을 테스트할 때 다음을 실행하십시오.복사데이터를 백업하고 데이터를 백업하세요.


또 다른 (더 쉬운) 접근 방식은 단순히 오래된 파일을 삭제한 다음 아직 존재하는 오래된 파일의 수를 세는 것입니다. 숫자는 실패 횟수입니다 rm(단순화를 위해 여기서는 사용함 -delete).

find "$CDIR" ! -type d -mtime +7 -delete
find "$CDIR" ! -type d -mtime +7 -exec echo x \; | wc -l

그런 다음 위에서 언급한 것처럼 빈 디렉터리를 정리할 수도 있습니다.

관련 정보