You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

需求:编写非递归识别目录空文件的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
使用方法
  1. 把脚本保存到你的用户主目录,比如命名为~/find-empty-files.sh
  2. 给脚本添加执行权限:
    chmod +x ~/find-empty-files.sh
    
  3. 运行脚本:
    • 查找当前目录的空文件:~/find-empty-files.sh
    • 查找指定目录的空文件:~/find-empty-files.sh /path/to/your/directory

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:14:37