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

2024-10-23 08:47:00
admin
原创
238
摘要:问题描述:我有一个名为diff.txt的文件。我想检查它是否为空。我编写了类似下面的 bash 脚本,但无法使其工作。if [ -s diff.txt ] then touch empty.txt rm full.txt else touch full.txt ...

问题描述:

我有一个名为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:

  1. (对于上面的人)我不确定你是否真的想在[[程序中使用逻辑运算符。也许你应该使用[[ expr_1 ]] && [[ expr_2 ]]而不是[[ expr_1 && expr_2 ]]

  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”。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用