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
-mtime
및 zsh
의 전역 한정자 는 m
정수(내림) 일수로 표현된 연령에 적용됩니다. -mtime -6
6세 미만, -mtime 6
6세(실제로는 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 디렉토리를 한 번만 생성하고 추가하세요.