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




