-s FILE测试返回真当且仅当FILE存在、为普通文件且大小大于0字节;否则返回假,包括文件不存在、非普通文件或大小为0等情况。

用 -s 测试操作符即可直接判断文件是否为空字节(即大小为 0 字节)。
核心判断方式:[ -s FILE ]
该测试返回真(exit code 0)当且仅当 FILE 存在、是普通文件、且大小大于 0 字节;否则返回假——包括文件不存在、是目录、是符号链接,或大小为 0 字节的情况。
-
✅ 正确用法示例:
[ -s myfile.txt ] && echo "非空" || echo "空或不存在" -
✅ 安全写法(先确保存在再判内容):
if [ -f myfile.txt ] && [ -s myfile.txt ]; then echo "存在且非空"; fi -
❌ 错误理解:
[ -s ]不带参数会报错;[ ! -s file ]为真时只说明“不满足非空条件”,不能直接等同于“是空文件”——它还可能是目录、设备文件、权限不足读取等。
区分“空文件”和“file 命令显示 empty”
当 file myfile 输出 myfile: empty,说明该文件确实是 0 字节普通文件。这是 file 命令在文件系统检查阶段通过 stat() 发现 size == 0 后的明确结论。它和 [ -s file ] 为假的子集高度一致,但更侧重类型识别而非逻辑判断。
注意隐藏陷阱
以下情况看似“空”,但 不是 0 字节空文件,[ -s ] 会返回真:
- 含空白字符的文件(如仅一个空格、换行符、tab)——大小 ≥ 1 字节
- 二进制零字节文件(
printf '\0' > zero.bin)——大小为 1,[ -s ]为真,但file可能显示data - 稀疏文件或特殊设备文件(如
/dev/null)——[ -s ]对设备文件通常返回假,但它们不属于“空文件”范畴
批量检查脚本片段
若需遍历当前目录下所有普通文件并列出空文件:
for f in *; do [ -f "$f" ] && ! [ -s "$f" ] && echo "empty: $f" done
这比单纯依赖 find . -type f -empty 更可控,避免递归进入敏感路径,也绕开了 -empty 对目录的严格定义干扰。


















