私は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
キャリッジリターンが含まれており、番号に渡されるにはnumfmt
1 つが含まれています。 に渡す前にそれを削除できます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() を使用する必要があります。空白だけを無視するのが正しいと思います。