删除文件

删除文件

我编写了以下代码来删除超过 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

请注意,-mtimeandzshm全局限定符适用于以整数(向下舍入)天数表示的年龄。-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 目录并添加到其中。

相关内容