파일 삭제

파일 삭제

7일보다 오래된 파일을 삭제한 다음 7일보다 오래된 빈 디렉터리를 삭제하려면 다음 코드를 작성했습니다.

파일 삭제

find "$CDIR" ! -type d -mtime +7 -exec sh -c '

        for pathname do

            if ! rm -fv "$pathname"; then

            ((err_count_f++))

            fi

        done' sh {} +

디렉토리 삭제

find "$CDIR" -type d -empty -mtime +7 -exec sh -c '

        for pathname do

            if ! rmdir -v "$pathname"; then 

            ((err_count_d++))

            fi

        done' sh {} +`

그러나 디렉터리의 파일을 삭제하면 해당 디렉터리의 mtime이 변경되므로 연결된 빈 디렉터리는 삭제되지 않습니다. 이 문제를 극복하는 가장 좋은 방법은 무엇입니까?

답변1

호환 가능 zsh(및 GNU find또는 호환 가능 -delete):

cd -P -- "$CDIR" || exit
old_dirs=(**/*(DNm+6))
find . -mtime +6 ! -type d -delete
empty_old_dirs=($^old_dirs(N^F))
(($#empty_old_dirs == 0)) || rmdir -- $empty_old_dirs

-mtimezsh의 전역 한정자 는 m정수(내림) 일수로 표현된 연령에 적용됩니다. -mtime -66세 미만, -mtime 66세(실제로는 6~7일) -mtime +6,엄격하게6일 이상, 즉 7일 이상입니다.

-mtime +6따라서 7일보다 오래된 파일의 경우 대신 필요합니다 -mtime +7(적어도 POSIX 호환 find구현의 경우 모든 파일이 아니라 GNU 파일이 그렇습니다).

답변2

먼저 7일 전의 빈 디렉터리를 임시 파일에 추가한 다음 파일 삭제를 실행할 수 있습니다. 그런 다음 빈 디렉터리를 검색하고 파일을 확인합니다.

dirs_mtime7=$(mktemp) ## Create a temp file. 
find "$CDIR" -type d -mtime +7 >> "${dirs_mtime7}" 
## 
## File deletion find command goes HERE ...
##         
while IFS= read -r -d '' a; do         
 grep -q -F -f "${dirs_mtime7}" <<< "${a}" && rmdir -v "${a}" 
done < <(find "$CDIR" -type d -empty -print0)

이 디렉토리는 오래되기 때문에 임시 파일에 7일 된 새 디렉토리를 추가하기만 하면 됩니다. dirs_mtime7 디렉토리를 한 번만 생성하고 추가하세요.

관련 정보