You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Shell脚本删除目录文件并统计数量:删除成功但计数显示为0

解决Shell脚本统计删除文件数量的问题

嗨,我来帮你搞定这个统计删除文件数量的问题!

你之前的脚本里,rm -rf默认不会输出任何被删除的文件路径,所以管道到wc -l的时候根本没有输入内容,自然统计出来的结果就是0了——这就是为啥文件删成功了,但计数不对的核心原因。

下面给你几个靠谱的解决方案,按推荐程度排序:

方案一:用find命令(最推荐,兼容所有系统且支持特殊文件名)

这个方法能完美处理带空格、换行符或者特殊字符的文件名,而且兼容性拉满:

#!/bin/sh
# 定义要操作的目标目录
target_dir="/Directory/SubDirectory"

# 统计目标目录下的文件数量(只统计当前目录,不递归子目录)
file_count=$(find "$target_dir" -maxdepth 1 -type f | wc -l)

# 删除目标目录下的所有文件
find "$target_dir" -maxdepth 1 -type f -delete

# 输出结果
echo "$file_count files deleted"

如果连子目录也要一起删除并统计,去掉-type f参数就行,改成:

file_count=$(find "$target_dir" -maxdepth 1 ! -path "$target_dir" | wc -l)
find "$target_dir" -maxdepth 1 ! -path "$target_dir" -delete

! -path "$target_dir"是为了排除目录本身,只统计里面的内容。

方案二:让rm输出删除日志再统计(仅GNU系统可用)

如果你用的是Linux这类GNU环境,rm支持-v(verbose)参数,会打印每个被删除的文件路径,这时就能用wc -l统计了:

#!/bin/sh
target_dir="/Directory/SubDirectory"

# 用rm -v输出删除的文件,同时统计行数
file_count=$(rm -rfv "$target_dir"/* | wc -l)

echo "$file_count files deleted"

注意:这个方法在BSD系统(比如macOS)上可能用不了,因为BSD的rm没有-v参数。

方案三:用ls统计(仅适用于无特殊字符的文件名)

如果你的文件名里没有空格、换行符这类特殊字符,也可以先统计再删除,但这个方法局限性比较大,不推荐在生产环境用:

#!/bin/sh
target_dir="/Directory/SubDirectory"

# 统计目录下的文件数量
file_count=$(ls -1 "$target_dir" | wc -l)

# 删除所有内容
rm -rf "$target_dir"/*

echo "$file_count files deleted"

内容的提问来源于stack exchange,提问作者Prakash Mhasavekar

火山引擎 最新活动