如何捕获Linux中删除多个文件时没有错误?

如何捕获Linux中删除多个文件时没有错误?

我正在使用以下命令删除目录/文件。据我所知,如果任何目录/文件具有访问权限或任何其他问题,它将被跳过,其余文件将被删除。

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

RETURN_CODE_CLEANUP=$?

现在,我想检查一下批量删除时发生了多少错误。我认为,RETURN_CODE_CLANUP对于一个或多个错误, 将会非零。我怎样才能捕获此方法中的错误?

答案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这将对及其子目录进行深度优先搜索,并删除修改时间戳超过一周前的任何文件或目录。内联 shell 脚本将被调用以批量找到路径名,并迭代每个路径名,尝试使用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和 的实现-delete,并且您可以删除空目录,即使它们没有被第一个find命令清空)

与往常一样,在测试进行此类清理的命令时,请运行副本数据,并备份您的数据。


另一种(更简单)的方法是简单地删除旧文件,然后计算仍然存在的旧文件的数量。该数字将是失败的次数rm(尽管我在这里使用是-delete为了简洁):

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

然后,您可能还想清理空目录,如上所述。

相关内容