需求:编写非递归识别目录空文件的Bash脚本
嘿,作为从Python转Bash的新手,完全理解你想避开复杂命令、追求直观实现的心情!咱们来一步步搞定这个识别空文件的脚本需求~
核心思路:遍历+文件判断
因为要求不递归、不用find,最直观的方式就是直接遍历目标目录的第一层文件,再逐个判断是否为空的普通文件。下面给你几个从基础到优化的实现方案:
基础版:用test/[ ]实现
这是最贴合你提到的test命令的写法,完全符合POSIX标准,兼容性拉满:
#!/bin/bash # 允许用户传入目标目录,默认用当前目录 TARGET_DIR="${1:-.}" # 遍历目标目录下的所有第一层条目 for file in "$TARGET_DIR"/*; do # 先判断是普通文件,再判断文件大小为0(空文件) if [ -f "$file" ] && [ ! -s "$file" ]; then echo "$file" fi done
代码解释:
#!/bin/bash:指定脚本用Bash解释器执行${1:-.}:如果用户运行脚本时传了目录参数(比如~/find-empty.sh /tmp),就用这个参数作为目标目录;否则默认用当前目录(.)[ -f "$file" ]:判断当前条目是否是普通文件(排除目录、软链接、设备文件等)[ ! -s "$file" ]:-s用来判断文件大小大于0,加!就表示文件大小为0,也就是空文件
更简洁的Bash扩展写法:用[[ ]]
Bash自带的[[ ]]是test的增强版,写法更灵活,支持把逻辑判断写在同一个括号里,还能避免很多引号转义的坑:
#!/bin/bash TARGET_DIR="${1:-.}" for file in "$TARGET_DIR"/*; do # 用Bash扩展测试符,逻辑与直接写在括号内 if [[ -f "$file" && ! -s "$file" ]]; then echo "$file" fi done
优化版:处理目录为空的情况
如果目标目录里没有任何文件,默认情况下"$TARGET_DIR"/*会被当作字面量字符串处理,循环会错误地判断这个字符串。可以开启Bash的nullglob选项解决这个问题:
#!/bin/bash # 开启nullglob:当glob匹配不到任何文件时,不生成任何条目 shopt -s nullglob TARGET_DIR="${1:-.}" for file in "$TARGET_DIR"/*; do if [[ -f "$file" && ! -s "$file" ]]; then echo "$file" fi done # 可选:关闭nullglob,避免影响后续脚本逻辑 shopt -u nullglob
使用方法
- 把脚本保存到你的用户主目录,比如命名为
~/find-empty-files.sh - 给脚本添加执行权限:
chmod +x ~/find-empty-files.sh - 运行脚本:
- 查找当前目录的空文件:
~/find-empty-files.sh - 查找指定目录的空文件:
~/find-empty-files.sh /path/to/your/directory
- 查找当前目录的空文件:
内容的提问来源于stack exchange,提问作者user8707725
相关产品推荐
相关产品推荐

