在 Bash 中检查两个文件的大小是不是不同

Posted

技术标签:

【中文标题】在 Bash 中检查两个文件的大小是不是不同【英文标题】:Check if two files are different sizes in Bash在 Bash 中检查两个文件的大小是否不同 【发布时间】:2014-04-28 03:03:31 【问题描述】:

我在这里找不到这个问题。如何在 Bash 中比较两个文件的文件大小,然后仅当两个文件大小不同时才执行某些操作?

【问题讨论】:

【参考方案1】:

补充@Steve Bennett 的有用回答:

stat 选项确实因平台而异;似乎 POSIX 标准并没有强制要求 stat 实用程序(只是一个库函数)。

这是一个bash函数,适用于Linux和BSD衍生的操作系统,包括OSX

# SYNOPSIS
#   fileSize file ...
# DESCRIPTION
#   Returns the size of the specified file(s) in bytes, with each file's 
#   size on a separate output line.
fileSize() 
  local optChar='c' fmtString='%s'
  [[ $(uname) =~ Darwin|BSD ]] &&  optChar='f'; fmtString='%z'; 
  stat -$optChar "$fmtString" "$@"

使用示例:

if (( $(fileSize FILE1.txt) != $(fileSize FILE2.txt) )); then
  echo "They're different."
fi

【讨论】:

是的,不幸的是,stat 不是 POSIX(例如 Solaris 没有它),因此非常难以移植。确定文件大小的唯一可移植方法是使用wc -c,不幸的是,它可能会读取整个文件。如果[FILE] 是常规文件,coreutils 实现会使用fstat() 对此进行优化(busybox 也曾这样做,但因为它显然已损坏而放弃了它)。另一种选择是使用find-printf 功能,但这也特定于GNU find(但可能在没有stat 的平台上可用)。 YMMV。【参考方案2】:

Bash 似乎没有内置此功能,但您可以使用 stat

if [ $(stat -c %s FILE1.txt) -ne $(stat -c %s FILE2.txt) ]; then 
   echo "They're different."
fi

stat 的确切参数可能因操作系统而异。

【讨论】:

以上是关于在 Bash 中检查两个文件的大小是不是不同的主要内容,如果未能解决你的问题,请参考以下文章

检查bash中是不是存在程序

OpenCV - 检查两个图像是不是 100% 相同的最快方法

如何使用 Bash 检查文件是不是包含特定字符串

检查传递的参数是不是是 Bash 中的文件或目录

如何在 bash 脚本中使用 find 命令检查目录大小

PHP - 检查两个数组是不是相等