我编写了以下代码来删除超过 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
(和 GNUfind
或兼容-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
andzsh
的m
全局限定符适用于以整数(向下舍入)天数表示的年龄。-mtime -6
是针对严格小于 6 岁的年龄,-mtime 6
是针对该年龄为 6 岁(因此实际上在 6 到 7 天之间)并且-mtime +6
针对该年龄严格地大于 6,即 7 天及以上。
因此,对于超过 7 天的文件,您需要-mtime +6
,而不是-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 目录并添加到其中。