我正在使用以下命令删除目录/文件。据我所知,如果任何目录/文件具有访问权限或任何其他问题,它将被跳过,其余文件将被删除。
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
然后,您可能还想清理空目录,如上所述。