我有一个叫diff。txt的文件。我想看看它是不是空的。

我写了一个bash脚本,类似于下面,但我不能让它工作。

if [ -s diff.txt ]
then
        touch empty.txt
        rm full.txt
else
        touch full.txt
        rm emtpy.txt
fi

当前回答

虽然其他答案是正确的,但使用“-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

其他回答

许多答案是正确的,但我觉得他们可以更完整 /简单化等等,例如:

例1:基本if语句

# BASH4+ example on Linux :

typeset read_file="/tmp/some-file.txt"
if [ ! -s "${read_file}" ]  || [ ! -f "${read_file}" ] ;then
    echo "Error: file (${read_file}) not found.. "
    exit 7
fi

如果$read_file为空或不为空,则使用exit停止显示。我不止一次把上面的答案误解成相反的意思。

例2:作为函数

# -- Check if file is missing /or empty --
# Globals: None
# Arguments: file name
# Returns: Bool
# --
is_file_empty_or_missing() {
    [[ ! -f "${1}" || ! -s "${1}" ]] && return 0 || return 1
}

虽然其他答案是正确的,但使用“-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

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

if [[ -z $(grep '[^[:space:]]' $filename) ]] ; then
  echo "Empty file" 
  ...
fi
[ -s file.name ] || echo "file is empty"

类似于@noam-manos的基于grep的答案,我用cat解决了这个问题。对我来说,-s不起作用,因为我的“空”文件有>0个字节。

if [[ ! -z $(cat diff.txt) ]] ; then
    echo "diff.txt is not empty"
else
    echo "diff.txt is empty"
fi