如何在 Bash 中检查文件是否为空?
- 2024-10-23 08:47:00
- admin 原创
- 70
问题描述:
我有一个名为diff.txt的文件。我想检查它是否为空。
我编写了类似下面的 bash 脚本,但无法使其工作。
if [ -s diff.txt ]
then
touch empty.txt
rm full.txt
else
touch full.txt
rm empty.txt
fi
解决方案 1:
试试这个:
#!/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
empty.txt
顺便注意,我已经交换了和的角色full.txt
,正如@Matthias所建议的那样。
解决方案 2:
[ -s file.name ] || echo "file is empty"
解决方案 3:
[ -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
解决方案 4:
要检查文件是否为空或者仅包含空格,可以使用 grep:
if [[ -z $(grep '[^[:space:]]' $filename) ]] ; then
echo "Empty file"
...
fi
解决方案 5:
虽然其他答案都是正确的,但使用该"-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
解决方案 6:
检查文件是否为空的最简单方法:
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"
解决方案 7:
@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
解决方案 8:
[[ -f filename && ! -s filename ]] && echo "filename exists and is empty"
解决方案 9:
许多答案都是正确的,但我觉得它们可以更完整/更简单等。例如:
示例 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 为空或不为空,则停止显示并退出。我不止一次误读了此处的顶部答案,认为其含义相反。
示例 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
}
解决方案 10:
与@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
解决方案 11:
我来这里寻找如何删除空__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 环境,因此它会破坏您打开的 shell。无论如何,我想分享一下!
解决方案 12:
(对于上面的人)我不确定你是否真的想在
[[
程序中使用逻辑运算符。也许你应该使用[[ expr_1 ]] && [[ expr_2 ]]
而不是[[ expr_1 && expr_2 ]]
。该表达式
[[ -s file.txt ]]
还检查文件是否存在,因此我认为-f
在此之前没有任何理由使用它。
这是一个简单的语句,用于检查文件是否存在、是否为空且包含 0:
if [[ ! -s ./example.txt ]] || grep -q 0 "./example.txt"; then
echo "example.txt doesn't exist, is empty or contains 0"
else
echo "example.txt contains 1"
最后说明一下:请注意,空文件并不总是空的:
touch example.txt
- 该文件是空的echo "" > example.txt
- 此文件不为空
解决方案 13:
我的回答对于使用“虚拟”文件系统(如)有些具体sysfs
。如果您使用此处大多数答案中提到的方法,此类文件系统可能会产生错误的结果。因为文件可以被stat
视为具有非零长度,但如果您尝试读取其内容,您将什么也得不到(或 I/O 错误)。
cat -n 1 '/path/to/file' &> /dev/null && echo true || echo false
稍微解释一下。这里我们尝试从文件中读取第一行并默默忽略其内容(将其发送到/dev/null
)。根据退出状态,我们打印“true”或“false”。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件