Bash

如何在 find 命令中修改 -printf ‘%s n’ 以提供以 MB 為單位的大小而不是字節?

  • May 4, 2020

我正在編寫一個簡單的輔助函式來顯示文件的大小:

這是我到目前為止的程式碼:

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

至少在基於 GNU 的系統上,您應該能夠使用statnumfmt獲得所需的格式,例如:

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

更改--to-unit=1048576--to-unit=1000000取決於您想要 MB 還是 MiB。

如果您有權訪問以下的 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.))

引用自:https://unix.stackexchange.com/questions/584215