如何在Bash中检查文件是否为空?

Mic*_*ich 154 bash if-statement file-handling is-empty

我有一个名为diff.txt的文件.想检查它是否为空.做过这样的事但却无法正常工作.

if [ -s diff.txt ]
then
        touch empty.txt
        rm full.txt
else
        touch full.txt
        rm emtpy.txt
fi
Run Code Online (Sandbox Code Playgroud)

thb*_*thb 200

拼写错误很刺激,不是吗?检查你的拼写empty,但是也试试这个:

#!/bin/bash -e

if [ -s diff.txt ]
then
        rm -f empty.txt
        touch full.txt
else
        rm -f full.txt
        touch empty.txt
fi
Run Code Online (Sandbox Code Playgroud)

我喜欢shell脚本很多,但它的一个缺点是,当你拼错时,shell无法帮助你,而像你的C++编译器这样的编译器可以帮助你.

顺便提一下,我已经交换了empty.txt和的角色full.txt,正如@Matthias建议的那样.

  • 外壳可以帮助拼写错误.`空= empty.txt; 充分= full.txt; DIFF = diff.txt; if [-s $ {diff?}]; 那么r = $ {empty?} t = $ {full?}; 否则r = $ {full?} t = $ {empty?}; 网络连接; rm $ {r?}; 触摸$ {t?}` (6认同)
  • 使用工具 shellcheck 可以很好地发现拼写错误。 (2认同)
  • 你也可以`set -u` (2认同)
  • shebang 中传递的“-e”参数是什么? (2认同)

小智 62

[ -s file.name ] || echo "file is empty"
Run Code Online (Sandbox Code Playgroud)

  • [[-s file.name]] && echo"full"|| 回声"空" (7认同)
  • @smarber 对于这样的简单检查,请使用 `[ ... ]` 而不是 `[[ ... ]]`。后者是 bashism,仅应用于不兼容的 bash 检查(例如 regexp)。如果您碰巧编写了任何应该是 POSIX shell 可移植的东西(例如 Debian 系统脚本),您自己就会欣赏这个习惯:)。 (3认同)

Sur*_*rya 46

[[-s file]] - >检查文件的大小是否大于0

if [[ -s diff.txt ]]; then echo "file has something"; else echo "file is empty"; fi
Run Code Online (Sandbox Code Playgroud)

如果需要,它会检查当前目录中的所有*.txt文件; 并报告所有空文件:

for file in *.txt; do if [[ ! -s $file ]]; then echo $file; fi; done
Run Code Online (Sandbox Code Playgroud)

  • 你不需要做`$(ls*.txt`,实际上不应该.有些人为`ls`设置了使用long格式的默认设置(比如我),shell已经扩展了`*. txt`本身.只需要`for file in*.txt`. (3认同)

Noa*_*nos 11

要检查文件是否为空或只有空格,您可以使用 grep:

if [[ -z $(grep '[^[:space:]]' $filename) ]] ; then
  echo "Empty file" 
  ...
fi
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一好的答案,应该被接受。使用“-s”并不能回答这个问题。它查找确实存在且大小大于 0 字节的文件。 (6认同)

Nab*_*ikh 10

检查文件是否为空的最简单方法:

if [ -s /path-to-file/filename.txt ]
then
     echo "File is not empty"
else
     echo "File is empty"
fi
Run Code Online (Sandbox Code Playgroud)

你也可以单行写:

[ -s /path-to-file/filename.txt ] && echo "File is not empty" || echo "File is empty"
Run Code Online (Sandbox Code Playgroud)


gee*_*eya 8

当其他答案正确时,"-s"即使该文件不存在,使用该选项也会显示该文件为空。
通过添加此其他检查"-f"以首先查看文件是否存在,我们确保结果正确。

if [ -f diff.txt ]
then
  if [ -s diff.txt ]
  then
    rm -f empty.txt
    touch full.txt
  else
    rm -f full.txt
    touch empty.txt
  fi
else
  echo "File diff.txt does not exist"
fi
Run Code Online (Sandbox Code Playgroud)


sma*_*ber 8

@geedoubleya答案是我最喜欢的。

不过,我更喜欢这个

if [[ -f diff.txt && -s diff.txt ]]
then
  rm -f empty.txt
  touch full.txt
elif [[ -f diff.txt && ! -s diff.txt ]]
then
  rm -f full.txt
  touch empty.txt
else
  echo "File diff.txt does not exist"
fi
Run Code Online (Sandbox Code Playgroud)


Rad*_*nka 7

[[ -f filename && ! -s filename ]] && echo "filename exists and is empty"
Run Code Online (Sandbox Code Playgroud)