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()を使用する必要があります。空白を無視するのが正しいと思います。