gpt4 book ai didi

shell - 格式化 du 命令输出

转载 作者:行者123 更新时间:2023-12-04 19:26:06 26 4
gpt4 key购买 nike

有没有办法格式化(在 shell 命令链中)du -s -k *

的以下输出
287720  crm-cc
21500 crm-mvh
40360 elasticsearch-5.1.2
293292 electron-quick-start
44636 hexagon
193572 jpk
132 knights
209860 pink-panther
1722104 popc
4 server-config.txt
45392 sigb-backend
47468 test
58904 um-report
164156 zeus

通过以下方式:

1,763,434,496 popc
300,331,008 electron-quick-start
294,625,280 crm-cc
214,896,640 pink-panther
198,217,728 jpk
168,095,744 zeus
60,317,696 um-report
48,607,232 test
46,481,408 sigb-backend
45,707,264 hexagon
41,328,640 elasticsearch-5.1.2
22,016,000 crm-mvh
135,168 knights
4,096 server-config.txt

我的意思是:

  • 按大小降序排列文件/目录。
  • 每三个字符插入一个千位分隔符,从对。
  • 插入前导空格以使尺寸右对齐

I have implemented this in PHP但我希望有一个更通用的解决方案(并非每个基于 linux 的操作系统都安装了 PHP 解释器)。

如果相关的话,我大部分时间都在使用 zsh,因此解决方案可以仅限于此 shell。

最佳答案

例如,让我们考虑一个包含这些文件的目录:

$ du -sk *
12488 big.log
200 big.pdf
4 f1
2441412 output.txt
160660 program.zip
4 smallfile
4 some.txt

根据需要重新格式化 du:

$ du -sk * | sort -rn | sed -E ':a; s/([[:digit:]]+)([[:digit:]]{3})/\1,\2/; ta' | awk -F'\t' '{printf "%10s %s\n",$1,substr($0,length($1)+2)}'
2,441,412 output.txt
160,660 program.zip
12,488 big.log
200 big.pdf
4 some.txt
4 smallfile
4 f1

注意:此方法甚至适用于包含空格的文件名。

方便的 Shell 函数

由于上面的内容很多,让我们创建一个shell函数:

$ dusk() { du -sk "$@" | sort -rn | sed -E ':a; s/([[:digit:]]+)([[:digit:]]{3})/\1,\2/; ta' | awk -F'\t' '{printf "%10s %s\n",$1,substr($0,length($1)+2)}';}

我们可以如下使用shell函数:

$ dusk *
2,441,412 output.txt
160,660 program.zip
12,488 big.log
200 big.pdf
4 some.txt
4 smallfile
4 f1

工作原理

  • du -sk *

    这是我们的 du 命令。

  • 排序-rn

    这会以相反的顺序进行数字排序,以便最大的文件排在第一位。

  • sed -E ':a; s/([[:digit:]]+)([[:digit:]]{3})/\1,\2/; ta'

    这会将逗号放在我们想要的地方。

  • awk -F'\t' '{printf "%10s %s\n",$1,substr($0,length($1)+2)}';}

    这使数字右对齐。

多行版本

对于那些喜欢将命令分散在多行中的人:

du -sk * |
sort -rn |
sed -E ':a; s/([[:digit:]]+)([[:digit:]]{3})/\1,\2/; ta' |
awk -F'\t' '{printf "%10s %s\n",$1,substr($0,length($1)+2)}'

与 Mac OSX/BSD 的兼容性

试试看它是否适用于 OSX:

$ echo 1234567890 | sed -E -e :a -e 's/([[:digit:]]+)([[:digit:]]{3})/\1,\2/' -e ta 
1,234,567,890

如果可行,那么让我们将完整的命令修改为:

du -sk * | sort -rn | sed -E -e :a -e 's/([[:digit:]]+)([[:digit:]]{3})/\1,\2/' -e ta  | awk -F'\t' '{printf "%10s %s\n",$1,substr($0,length($1)+2)}'

关于shell - 格式化 du 命令输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47803917/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com