numfmt 入力サフィックスが無効です。

numfmt 入力サフィックスが無効です。

numfmtリモートファイルをContent-LengthバイトからIEC形式に変換するために使用します。21M

$ curl -sI http://jruby.org.s3.amazonaws.com/downloads/1.7.12/jruby-bin-1.7.12.tar.gz|grep Length|cut -d' ' -f2|numfmt --from=auto --to=iec
'numfmt: invalid suffix in input: '21981488

numfmtが間違ったサフィックスについて文句を言う理由を混乱させます。コマンドを分割してコマンドの出力を確認cutし、値を手動でエコーすると、期待numfmtどおりに機能します。

$ curl -sI http://jruby.org.s3.amazonaws.com/downloads/1.7.12/jruby-bin-1.7.12.tar.gz|grep Length|cut -d' ' -f2 -
21981488
$ echo 21981488|gnumfmt --from=auto --to=iec
21M

ここで何か抜けましたか?

答え1

出力にcurlキャリッジリターンが含まれているようです。数字aを含むように渡されますnumfmt。次に、転送する前に削除できますnumfmt

curl ... | awk -F: '/Length/{sub("\r", "", $2); print $2}' | numfmt ...

またgrep、およびはcutしばしば代替単一のコマンドで置き換えることができます。

答え2

coreutils-8.21には、誤った内容を正しく引用しないバグがありました。リリースされた8.22で実行すると、より明白なエラーが発生します。

numfmt: invalid suffix in input: ‘21981488\r’

数字の後にスペースやタブがある場合、numfmtはそれを無視しますが(isblank()を使用するため)、\ rを無視するにはisspace()を使用する必要があります。空白を無視するのが正しいと思います。

関連情報