如何检查一个文件是否为空的Bash?

我有一个名为< >强diff.txt < / >强的文件。我想看看它是不是空的。

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

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

拼写错误很烦人,不是吗?检查你的empty的拼写,但也可以试试这个:

#!/bin/bash -e


if [ -s diff.txt ]; then
# The file is not-empty.
rm -f empty.txt
touch full.txt
else
# The file is empty.
rm -f full.txt
touch empty.txt
fi

我非常喜欢shell脚本,但它的一个缺点是,当你拼写错误时,shell不能帮助你,而像c++编译器这样的编译器可以帮助你。

顺便注意一下,我交换了empty.txtfull.txt的角色,正如@Matthias所建议的那样。

[ -s file.name ] || echo "file is empty"

[ -s file ] # Checks if file has size greater than 0

[ -s diff.txt ] && echo "file has something" || echo "file is empty"

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

for file in *.txt; do if [ ! -s $file ]; then echo $file; fi; done
虽然其他答案是正确的,但使用"-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

@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
很多答案是正确的,但我觉得他们可以更完整 例如:

.

例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
}

我来这里寻找如何删除空__init__.py文件,因为它们在Python 3.3+中是隐式的,最终使用:

find -depth '(' -type f  -name __init__.py ')' -print0 |
while IFS= read -d '' -r file; do if [[ ! -s $file ]]; then rm $file; fi; done

同时(至少在zsh中)使用$path作为变量也会破坏你的$path env,因此它会破坏你的打开shell。不管怎样,我想分享一下!

[[ -f filename && ! -s filename ]] && echo "filename exists and is empty"

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

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

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

if [ -s /path-to-file/filename.txt ]
then
echo "File is not empty"
else
echo "File is empty"
fi

你也可以用单行写:

[ -s /path-to-file/filename.txt ] && echo "File is not empty" || echo "File is empty"

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

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