バイトではなくMB単位でサイズを指定するために、findコマンドで-printf "%s \ n"をどのように変更しますか?

バイトではなくMB単位でサイズを指定するために、findコマンドで-printf "%s \ n"をどのように変更しますか?

ファイルサイズを表示する簡単なヘルパー関数を書いています。
これまでのコードは次のとおりです。

find . -type f -size +10M -printf "%f -> %s B\n"

私が得た結果は次のとおりです。

clay-banks--Ni2fpLUgRI-unsplash.jpg -> 181794593 B
jake-nackos-_kdX2vPc33U-unsplash.jpg -> 448148323 B
73-738467_nature-wallpapers-high-quality-images-hd-desktop-images.jpg -> 131115725 B

しかし、ファイルサイズをMB単位で表示したいと思います。

bのように動作するにはどうすれば修正できますか?

clay-banks--Ni2fpLUgRI-unsplash.jpg -> 173 MB
jake-nackos-_kdX2vPc33U-unsplash.jpg -> 427 MB
73-738467_nature-wallpapers-high-quality-images-hd-desktop-images.jpg -> 125 MB

答え1

少なくともGNUベースのシステムでは、必要な形式を使用してstat取得できる必要があります。たとえば、次のようになります。numfmt

find . -type f -size +10M -printf "%f -> " -exec sh -c '
  stat -c "%s" "$1" | numfmt --to-unit=1048576 --format="%.0f MB"
' sh {} \;

MBまたはMiBが必要かどうかに応じて--to-unit=1048576変更してください。--to-unit=1000000

答え2

ast-open実装にアクセスできる場合ls

find . -type f -size +10M -exec ls -ldh --format='%(name)s -> %(size)dB' {} +

MiB、、GiB……TiBサフィックスは適切な場合に使用されます。

の場合、zshすべてのシステムで(組み込み機能のみを使用)、MiBのみ(最も近い値に丸められます):

zmodload zsh/stat
stat -LnA info +size -- **/*(D.LM+10)
for f s ($info) printf '%s -> %.0fMiB\n' $f $(($s / 1048565.))

答え3

ゲームは終わり、@steeldriverが勝利しました。+1;-)しかし、別の方法(多分もっと簡単でしょうか?)を使います。

$ find . -type f -size +10M -printf "%f\0%s\n" | awk -F'\0' '{printf("%s -> %.0f MB\n", $1,$2/1048576)}'

関連情報