如何使用AWK获取文件夹的大小



我正在尝试获取起诉AWK的文件夹的所有路径和总大小;我的第一个方法是使用此脚本:

BEGIN { OFS=" " }
sub(/^\/,"/") { path = $0; next }
path == "" { next }
match($0,/^(.*[^ ]) +A +([^ ]+) +(.*)/,a) { print substr(path,2) "\ " a[2] }

但这给了我文件夹内每个文件的大小路径,而不是文件夹的总数,所以我认为它需要是使用 sum 的东西。

所以这是我的意见:

README.txt         A  45  Mon Aug 30 18:50:16 2018        
Test Cases.xlsx         A  1415577  Wed Aug 29 14:00:16 2018
Qt Database EltraJoDR0151-populatedDaJaASAA Imagesk0097Qingl
R0097A+05.00B-00-QingL.JPG          A  6958377  Fri Jun  8 12:53:30 2018
R0097A+05.00B-00-QingLI.JPG         A  2794933  Fri Jun  8 12:53:30 2018
R0097A-00.00B-00-QingLI.JPG         A  2825705  Fri Jun  8 12:53:30 2018
R0097A-00.00B-00-QingLO.JPG         A  1369520  Fri Jun  8 12:53:30 2018
Thumbs.db                           A    20480  13969015Fri Jun  8 13:14:41 2018
QJ Database EltraJoDR0151-populatedDaJaASAA Imagesk0098Qingl
R0098A+05.00B-00-QingL.JPG          A  6958377  Fri Jun  8 12:54:30 2018
R0098A-00.00B-00-QingLO.JPG         A  1369520  Fri Jun  8 12:54:30 2018
Thumbs.db                           A    20480  Fri Jun  8 13:14:41 2018

我的输出应该是这样的:

Qt Database EltraJoDR0151-populatedDaJaASAA Imagesk0097Qingl,13969015 
QJ Database EltraJoDR0151-populatedDaJaASAA Imagesk0098Qingl,8348377 

这是一个重构,它似乎可以做你想要的。

BEGIN { OFS="," }
/^\/ { if(path) print path, sum; path = $0; sum = 0; next }
path == "" { next }
match($0,/^(.*[^ ]) +A +([^ ]+) +(.*)/,a) { sum+= a[2] }
END { if(path) print path, sum }'

诀窍是收集东西并在收集完成后打印结果。(一个常见的初学者错误是忘记打印最后一个集合。在END中第二次使用相同的代码有点疣 - 如果它更复杂,我会把它放在一个函数中。

您似乎想要逗号分隔的输出,因此我们将OFS设置为该输出。

三参数match()需要 GNU Awk。

当您可以简单地使用"du"时,为什么要为此而苦苦挣扎?

du -sh <dir_name>

最新更新