在目录列表中显示文件大小总和


71

Windows dir目录列表命令的末尾有一行,显示列出的文件占用的空间总量。例如,dir *.exe显示.exe当前目录中的所有文件,文件大小以及文件大小的总和。我希望dir在bash中使用别名具有类似的功能,但是我不确定该怎么做。

目前,我有alias dir='ls -FaGl'我的.bash_profile,显示

drwxr-x---+  24 mattdmo  4096 Mar 14 16:35 ./
drwxr-x--x. 256 root    12288 Apr  8 21:29 ../
-rw-------    1 mattdmo 13795 Apr  4 17:52 .bash_history
-rw-r--r--    1 mattdmo    18 May 10  2012 .bash_logout
-rw-r--r--    1 mattdmo   395 Dec  9 17:33 .bash_profile
-rw-r--r--    1 mattdmo   176 May 10  2012 .bash_profile~
-rw-r--r--    1 mattdmo   411 Dec  9 17:33 .bashrc
-rw-r--r--    1 mattdmo   124 May 10  2012 .bashrc~
drwx------    2 mattdmo  4096 Mar 24 20:03 bin/
drwxrwxr-x    2 mattdmo  4096 Mar 11 16:29 download/

例如。从这个问题的答案:

dir | awk '{ total += $4 }; END { print total }'

这给了我总数,但不打印列出目录的目录。有没有一种方法可以将其更改为单行脚本或shell脚本,以便我可以传递ls我想要的任何参数,dir并获得完整的清单以及总和?例如,我想运行dir -R *.jpg *.tif以获取所有子目录中这些文件类型的列表和总大小。理想情况下,如果我可以获取每个子目录的大小,那就太好了,但这不是必需的。


5
为什么没有ls -lh帮助您?它在顶部打印总和。您还可以运行du -sh *.exe以易于阅读的形式获取磁盘空间使用信息。
bagavadhar

@ashwin我不知道ls -lh打印的“总计” 是什么,但是它并不总是与awk下面的脚本的计算内容或我手工添加的内容有关。有时它接近目录中KB文件的数量,但是似乎并没有使子目录的分配大小生效。如果您能向我解释这个数字的确切含义,我将不胜感激
MattDMo 2013年

看看我的以下回答是否对您
有用

1
ls -lh不会显示计算目录内容的目录总大小
aequalsb

Answers:


25

以下功能可满足您的大部分要求:

dir () { ls -FaGl "${@}" | awk '{ total += $4; print }; END { print total }'; }

...但是它不能满足您的要求dir -R *.jpg *.tif,因为那不是ls -R工作原理。您可能想为此使用该find实用程序。


1
的确如此,如果您实质上是在寻找每个文件的内容大小,而不是文件在磁盘上消耗的大小。对于非常小的文件,这种区别更加明显。在我的发行版中,每个文件都以4 KB的块分配给磁盘上的空间(因此,由du命令报告,一个300字节的文件仍在磁盘上使用4K)。鉴于OP一直在寻找“每个文件占用多少空间”的内容,因此du是解决之道。
Jon V

1
dir已经是流行的GNU coreutil的名称,我宁愿不这样命名一个函数。
甜点

请修复,使其在Linux和OS-S上均可使用,并且您的“ -a”包括“”。和“ ..”,这不好:)这是固定的命令:dir(){ls -FAl“ $ {@}” | awk'{总计+ = $ 5; 打印}; END {打印“总计:”总计}';}
德米特里Shevkoplyas

148

已有UNIX命令: du

做就是了:

du -ach 

按照约定,您可以在命令末尾添加一个或多个文件或目录路径。-h是将大小转换为人类友好格式的扩展,-a为您提供了“表观”大小(文件大小而不是磁盘使用情况),并-c在最后给出了总计。


12
是的,du工作正常。您可以使用-c选项(与--total相同)在列表末尾获得总计。
2014年

6
请注意,它du给出的是磁盘使用情况,而不是文件大小的总和。
斯特凡Chazelas

7
du -h不对传递给它的文件的大小求和。du -h *.so显示每个文件的大小,但不显示总和。我认为您想要的是du -hc *.so(甚至是du -hc *.so | tail -1)。但是,当然,他也想要目录列表。
有限赎罪

1
此命令仅适用于简短文件列表。查看目录中有850000个文件时会发生什么!!!
Hamid FzM

3
-a意味着--all。考虑而不是使用--apparent-size
Arnauld VM '18



6

与Perl:

perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf

当前目录中所有非隐藏PDF文件的大小。


1

将以下内容添加到.bash_profile或.bashrc对我而言有效。

dir ()
{
find . -iname "$@" -exec ls -lh {} \;
find . -iname "$@" -print0|xargs -r0 du -csh|tail -n 1;
}

现在,当我执行目录* .mp3时,它会递归执行并在末尾显示总计。您可以通过在查找中添加maxdepth参数来控制所需的深度。我知道两次运行查找并不是一个很有效的想法。但是我想不出更好的方法。至少可以完成工作。


1

使用duawk语句(如上面提到的语句)将为您提供所需的内容。

例: du /home/abc/Downloads/*.jpg | awk '{ print; total += $1 }; END { print "total size: ",total }'

这将列出以jpg结尾的abc用户下载文件夹中的所有文件,并在列表末尾显示所有这些文件的总和。


0

要同时获取目录输出和大小计算,而无需使用任何其他建议的选项,则可以使用tee(1)和进程替换...

dir | tee >( awk '{ total += $4 }; END { print total }' )

无需tee,只是dir | awk '{print; total += $4}; END {print total}'
斯特凡Chazelas

0
du path_to_your_files/*.jpg | awk '{ total += $1 }; END { print total }'

3
不。首先,仅给出命令不是答案。其次,如果您不愿意阅读整个问题,其他答案和我的评论,您会发现这不是我想要的。
MattDMo

公平地说,这是Google搜索的第一个搜索结果linux sum human readable sizes,也是我要寻找的结果。
Sridhar Sarnobat

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.