シェルスクリプトのファイルサイズを比較する

シェルスクリプトで2つのファイルのサイズを比較しようとしていますが、 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

エコーを使って$ Iと$ Jの値をテストし、値は正しいが、私はそれらを比較できない...

4
IIRCでは、 == はbash拡張であり、bashの数値式で使用されます。(($ I == $ J))
追加された 著者 Edward Falk,

4 答え

これはbashで動作します

if((`stat -c%s "$file1"`==`stat -c%s "$file2"`));then
  echo "do something"
fi
4
追加された
@LOlliffe私が間違っていない場合、-cに-cを変更すると、問題はlinux -fの-file-systemを意味します。あなたが好きな場合は、私の答えを編集して、それを動作させた後に、マックの代替を追加すること自由に感じる:)
追加された 著者 Aquarius Power,
Macでは、これは stat:illegal option -c usage:stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...] を返します。
追加された 著者 LOlliffe,

試す

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

スペースを含むファイル名を持つことができるので、常に変数を引用します。

BASHは変数名では大文字と小文字を区別しませんが、変数には異なる名前(および1文字より長い文字)を使用する方が安全です。

0
追加された
ええ、それは本当です:)私はこれを今知っていますが、私が答えを書くときこれを知らなかった。それを修正する
追加された 著者 bartimar,
あなたが望むものがファイルサイズであれば、 cat foobar | wc -c は、ディスクから(またはリモートロケーションから、またはどこからでも)ファイル全体を読み込むためです。大きなファイルの場合は時間の無駄です。 wc -c foobar を使用することをお勧めします。
追加された 著者 Denilson Sá Maia,

大括弧( [] )と -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
0
追加された
それでも同じエラーが出力されます。
追加された 著者 Tiago Costa,
私はちょうど==の代わりに=を試して、それは働きました。
追加された 著者 Tiago Costa,
[$ I -eq $ J]の場合、 == の代わりに -eqを試してください。 then ...
追加された 著者 chown,
修正されました。うれしいことです。
追加された 著者 chown,

このようなことが働くかもしれない....

#/bin/bash 
I=`wc -c < echo $i` J=`wc -c < echo $j` if [ $I -eq $J ]; then echo $i $j >> $1.pares fi

抱擁!

0
追加された
スタックオーバーフローへようこそ!最初の文章を英語に翻訳し、それがなぜ機能するのか(なぜ質問のコードがうまくいかないのか)を説明してください。
追加された 著者 Jens Bannmann,