Calculate size of files in shell
我正试图用shell计算与文件名模式匹配的所有文件(在目录树中)的总大小(以字节为单位)。这就是我目前为止所拥有的:
find -name *.undo -exec stat -c%s {} \; | awk '{total += $1} END {print total}'
有更简单的方法吗?我觉得应该有一个简单的du或find开关来为我做这个,但我找不到。
要明确一点,我希望在目录树下的任何位置汇总与模式匹配的文件,这意味着
du -bs *.undo
无法工作,因为它只与当前目录中的文件匹配。
尝试:
1 | find . -name"*.undo" -ls | awk '{total += $7} END {print total}' |
在我的系统中,文件的大小是
在这个版本中,使用现有的目录信息(文件大小)和find的内置ls功能应该是有效的,避免了过程创建或文件I/O。
使用zsh,您可以使用扩展的globbing执行以下操作:
DU-C**/*.撤消
1 | find -name *.undo -print0 | du -hc --files0-from=- |
1 | du -c *pattern* |
这将在输出的最后一行打印合计。
我也一直在关注这个问题(仅仅一年之后…)-只是找到了这个页面。
我发现(对我)有用的东西是:
1 2 | find /mnt/iso -name *.avi -printf"%s " | paste -sd+ - | bc |
这将返回下面所有子文件夹中所有.avi文件的总大小/mnt/iso
我必须将粘贴命令归功于Radoulov-参见本页:shell命令对整数求和,每行一个?
只需添加—以防文件夹与搜索词匹配—在find命令中使用
1 | find -name '*.undo' -exec wc -c {} + | tail -n 1 |
如果没有太多的文件(其中"太多"将是一个非常大的数字,可能是以千为单位),那么应该给出文件中实际的字节总数。或者,如果你只想知道电话号码,
1 | find -name '*.undo' -exec wc -c {} + | tail -n 1 | cut -d' ' -f 1 |
python是大多数Linux发行版的一部分。
1 2 3 4 5 6 7 8 9 10 | import os import fnmatch size= 0 for path, dirs, files in os.walk( '.' ): for f in files: if fnmatch.fnmatch(f,'*.py'): fileSize= os.path.getsize( os.path.join(path,f) ) print f, fileSize size += fileSize print size |
很长,但非常清晰,可扩展性很强。
1 | find -name '*.undo' -print0 | du -hc --files0-from=- | tail -n 1 |
从格德姆布和斯特拉格的贡献中总结出来。使用
我使用这样的du命令只获取数字:
1 | du file_list | awk '{s+=$1} END {print s}' |
我认为带有xargs的版本可以被修改(简化)LS-1*.Undo xargs wc
du-c awk'./line=$0 end打印$1
Perl一个班轮:
1 | find . -name"*.undo" -ls | perl -lane '$t += $F[6]; END{print $t}' |
或者,您可以这样做:
1 2 3 4 5 6 7 8 9 10 11 | dir=$1 for file in $dir/* ; do length_file=`stat -c %s $file` echo"File $file has length $length_file" length_total=`expr $length_total + $length_file` done echo"Total length: $length_total ." |
其中stat显示文件或文件系统状态。参数-c表示使用指定的格式而不是默认格式,格式序列$s允许显示字节的总大小。
1 | expr |
只计算表达式。
这个简单的怎么样。
1 | find ./ -name *.undo | xargs wc |
检查du(磁盘使用)命令。