바이트 대신 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)}'

관련 정보