findのprintfを使用して人間が読めるファイルサイズを取得する

findのprintfを使用して人間が読めるファイルサイズを取得する

特定のフォルダを目的の形式で表示する単純なヘルパー関数を作成しています。

find . -maxdepth 1 -not -name "." -printf '[%TY-%Tm-%Td]\t%s\t%f\n' | sort -n

しかし、ファイルサイズをより良い形式で表示したいと思います。私が見つけたこの回答私はそれを使用してというbash関数を作成しますhr

user@host:~$ hr 12345
12M

私は次のように通貨でそれを試しましたfind

find . -maxdepth 1 -not -name "." -printf '[%TY-%Tm-%Td]\t'$(hr %s)'\t%f\n' | sort -n

ただし、引き続きファイルサイズ全体が引き続き表示されます。期待どおりに機能するにはどうすればよいですか?

答え1

numfmtfrom gnu coreutils8.21またはそれ以上)を使用して、ファイル名が正常であるとします。

find . -type f -printf '[%TY-%Tm-%Td]\t%s\t%f\n' | numfmt --field=2 --to=iec-i

--padding=--format=オプションを使用すると、出力形式をさらに指定できます。最新バージョン出力精度も設定できます。たとえば、次のようになります。

... |  numfmt --field=2 --to=iec-i --suffix=B --padding=8

または

... |  numfmt --field=2 --to=iec-i  --format='%10.3f'

権限とリンク数の列が気に入らない場合は、次を使用してくださいgnu ls

ls -gohAt --time-style=+%Y-%m-%d

答え2

-exec duそれ以降はどうでしたか-printf

たとえば、

jon@local$ find . -maxdepth 1 -not -iname "." -printf '[%TY-%Tm-%Td]\t' -exec du -bh {} \;
[2015-04-01]    1.6K    ./main.go
[2015-04-01]    5.2K    ./main_test.go

答え3

これを使用するには少し調整が必要ですが、ユーティリティには任意のdc出力ベースを処理するためのよく知られていない(潜在的に非常に便利な)機能が含まれています。一見すると変に見えます。

echo 1024o 1025p 1024p 1023p|dc

 0001 0001
 0001 0000
 1023

しかし、追いつくことはそれほど難しくありません。

ls -s  file;\
ls -hs file;\
echo 1024o 1048576p|dc

1048576 file
1.0G file
 0001 0000 0000

...そして...

dd bs=1kx1k seek=500 of=file <>/dev/null 2>&0;\
ls -s  file;\
ls -hs file;\
echo 1024o 512000p|dc

512000
500M
 0500 0000

私の好みdcですが、bc同じことが可能ですが、思ったほど簡単ではありません。

とにかく、dcスクリプトには役に立ちません。すでに提案されているとおりに使用していない場合は、少なくとも必要な方法で機能するためにfind ... -printfこれを行う必要があると思います。しかし、もっと柔軟で実用的なものに興味があるなら、それはあなたにとって大きな助けになるかもしれません。とにかく、関数が実行するほとんどの操作を簡単に実行できます。-execnumfmthr

答え4

フィールドの順序が重要でない場合

du --time --time-style=+[%F] -sh *

それ以外の場合は、自由に再注文できますsed

… | sed 's/\(\S*\s*\)\(\S*\s*\)/\2\1/'

関連情報