【问题标题】:Compare file sizes in shell script比较 shell 脚本中的文件大小
【发布时间】:2011-11-12 23:06:00
【问题描述】:

我正在尝试在 shell 脚本中比较两个文件的大小,但我得到一个 test: 32: 8: unexpected operator 错误。

I=`wc -c $i | cut -d' ' -f1`
J=`wc -c $j | cut -d' ' -f1`
if test $I == $J
then
      echo $i $j >> $1.pares
fi

我使用 echo 测试了 $I 和 $J 中的值,这些值是正确的,但我无法比较它们...

【问题讨论】:

  • IIRC,== 是 bash 扩展,用于 bash 数值表达式:(( $I == $J ))

标签: linux shell sh


【解决方案1】:

尝试使用方括号 ([]) 和 -eq,如下所示:

I=`wc -c $i | cut -d' ' -f1`
J=`wc -c $j | cut -d' ' -f1`
if [ $I -eq $J ]
then
      echo $i $j >> $1.pares
fi

【讨论】:

  • 尝试使用-eq 而不是==if [ $I -eq $J ]; then...
  • 我只是尝试了 = 而不是 == 并且它有效,并且 -eq 也有效
【解决方案2】:

这适用于 bash

if((`stat -c%s "$file1"`==`stat -c%s "$file2"`));then
  echo "do something"
fi

【讨论】:

  • 在 Mac 上,这将返回 stat: illegal option -- c usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
  • @LOlliffe 如果我没记错的话,将 -c 更改为 -f,问题是在 linux 上 -f 表示 --file-system。如果您愿意,可以通过编辑我的答案来添加一个 mac 替代品:)
  • @AquariusPower stat -f file.ext 只是在 macOS 上打印文件名 fiel.ext。要在 macOS 上获取文件大小(以字节为单位),请使用 stat -f%z file.ext
  • 这些天(2021 年)我看到 $() 被推荐作为反引号的首选,因为它很容易看到结束分隔符。
【解决方案3】:

这样的东西可以工作....

#/bin/bash <br>
I=`wc -c < echo $i`
J=`wc -c < echo $j`

if [ $I -eq $J ]; then

 echo $i $j >> $1.pares

fi

拥抱!

【讨论】:

  • 欢迎来到 Stack Overflow!请将开头的句子翻译成英文,并尝试解释它为什么起作用(以及为什么问题中的代码不起作用)。
【解决方案4】:

试试

I=`wc -c "$i"` # always use quoted var
J=`wc -c "$j"`
[[ "$I" == "$J" ]] && echo "$i" "$j" >> "$1".pares

总是引用变量,因为你可以有一个包含空格的文件名。

尽管 BASH 对变量名不区分大小写,但对变量使用不同的(并且长于一个字符)名称会更好、更安全。

【讨论】:

  • 如果您只需要文件大小,请避免使用cat foobar | wc -c,因为它会从磁盘(或远程位置或任何地方)读取整个文件。对于较大的文件,这只是浪费时间。更喜欢使用wc -c foobar
  • 是的,那是真的:) 我现在知道了,但是当我写答案时不知道。会解决的
  • 如果您想知道,wc 的这种合理优化至少从 1992 年首次提交给 coreutils 就已经存在:github.com/coreutils/coreutils/blob/…
  • 我更喜欢stat -c '%s' 来获取文件的大小。 wc 是一个很好的计算行数。
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
相关资源
最近更新 更多