使用 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,你至少必须这样做-exec才能让它按照你想要的方式工作。numfmt但如果你要适应一些更灵活、更充实的东西,它可能对你非常有用。无论如何,它可能可以更轻松地完成您的hr函数所做的大部分工作。

答案4

如果字段顺序不重要

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

在其他情况下,您可以自由地重新订购,sed例如

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

相关内容