web-dev-qa-db-ja.com

人にやさしいファイルのサイズを変数に保存するにはどうすればよいですか?

基本的に私がしたいことは、しきい値(私の場合は2.2 GB)を超えるサイズのディレクトリ内のすべてのファイルとそのサイズを出力するスクリプトを作成することです。以下のようにstatコマンドを使ってみました

a=$(stat -c '%s' example.txt)

ただし、ファイルサイズはバイト単位で保存されます。私が欲しいのは、人間が読める形式(MB、GB)でサイズを保存して表示することです。また、ls -lahの出力を保存し、結果をトリミングして名前とサイズのみを保存することも考えていましたが、これは面倒な作業のように思えました。結果をバイト単位で格納してから算術演算を行う以外に、これを行う他の方法はありますか?.

4
Vandan Bhardwaj

すでにGNUツールを使用しているため、numfmt from GNU coreutils:

$ stat -c %s file
310776
$ stat -c '%s' file | numfmt --to=si
311K
$ stat -c '%s' file | numfmt --to=iec
304K
$ stat -c '%s' file | numfmt --to=iec-i
304Ki
$ stat -c '%s' file | numfmt --to=si --suffix=B
311KB

ksh93

$ size=$(stat -c %s file)
$ printf "%#d %#i\n" "$size" "$size"
311k 304Ki

または、lsビルトイン( ast-open パッケージでスタンドアロンユーティリティとして取得することもできます)でビルドした場合:

$ type ls
ls is a Shell builtin version of /opt/ast/bin/ls
$ ls -Z '%#(size)d %#(size)i' file
311k 304Ki
6

スクリプトは必要ありません。du -d 0 -t 2200M -h /some/dir/name/*を使用してください。

例。 duを使用して、/ bin500Kより大きいすべてのファイルを表示します。

du -d 0 -t 500K -h /bin/*

出力:

1.1M    /bin/bash
620K    /bin/btrfs
2.0M    /bin/busybox
1.6M    /bin/ksh93
788K    /bin/zsh

sortには、上記をサイズ順に並べ替える-hがあります。

du -d 0 -t 500K -h /bin/* | sort -h

出力:

620K    /bin/btrfs
788K    /bin/zsh
1.1M    /bin/bash
1.6M    /bin/ksh93
2.0M    /bin/busybox
4
agc

親切な人 [〜#〜]ここ[〜#〜] はあなたを助けるべき解決策を提示します:

find . -type f -size +2G -exec ls -sh {} \; 2> /dev/null

完全に修飾されたパス名とサイズが人間が読める形式で表示され、すべて適切にソートされています。

2.2Gが必要な場合、findは小数を処理しないため、少し計算して(2048 + 205 =)2253M

find . -type f -size +2253M -exec ls -sh {} \; 2> /dev/null

findのパラメーターを使用して、検索の深さと必要なサイズを制限できます(man find)、およびawkを使用して列をファイルまたは配列に出力します。

編集:-lhは-shに変更され、awkは@Olorinの改善に従って削除されました

3
bu5hman
du -h example.txt|cut -f 1

-h = 人間が読める形式

これはyourの「人間による読みやすさ」の考え方とdのこの概念の考え方は同じであるという仮定の下にあります。

0
user1934428