计算shell中文件的大小
我试图计算所有文件的总大小(在一个目录树中)匹配一个文件名模式,只是使用shell。 这是我迄今为止:
find -name * .undo -exec stat -c%s {} \; | awk'{total + = $ 1} END {print total}'
有没有更简单的方法来做到这一点? 我觉得应该有一个简单的杜或find开关,这对我来说,但我找不到一个。
要清楚,我想要在一个目录树下的任何地方总共匹配模式的文件
du -bs * .undo
将不起作用,因为它只匹配当前目录中的文件。
尝试:
find . -name "*.undo" -ls | awk '{total += $7} END {print total}'
在我的系统上,文件的大小是find -ls
输出中的第七个字段。 如果您find … -ls
输出不同,请调整。
在这个版本中,使用现有的目录信息(文件大小)和find的内置ls特性应该是高效的,避免了过程创build或者文件i / o。
用zsh,你可以使用扩展的globbing来做:
du -c ** / *。撤消
find -name *.undo -print0 | du -hc --files0-from=-
du -c *pattern*
这将在最后一行输出中打印总数。
我也一直在看这个问题(只有一年后…) – 只是发现这个网页。
我发现的东西(对我来说)如下:
find /mnt/iso -name *.avi -printf "%s\n" | paste -sd+ - | bc
这将返回/ mnt / iso下面所有子文件夹中所有.avi文件的总大小
我不得不放弃对radoulov的粘贴命令 – 看到这个页面: 壳命令总结整数,每行一个?
只是为了添加 – 为了防止文件夹与search词相匹配 – 在find命令中使用-type f
也是一个好主意。
find -name '*.undo' -exec wc -c {} + | tail -n 1
应该给文件中实际的字节总数,如果你没有太多的文件(“太多”将是一个非常大的数字,可能是成千上万)。 或者,如果你只是想单独获取号码,
find -name '*.undo' -exec wc -c {} + | tail -n 1 | cut -d' ' -f 1
Python是大多数Linux发行版的一部分。
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
很长,但非常清晰,高度可扩展。
find -name '*.undo' -print0 | du -hc --files0-from=- | tail -n 1
从gerdemb和strager的贡献放在一起。 使用du -cb
应显示字节。
我使用这样的du命令来获取数字:
du file_list | awk '{s+=$1} END {print s}'
这个简单的怎么样?
find ./ -name *.undo | xargs wc
或者,你可以这样做:
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允许显示总字节数。
expr
只是评估一个expression式。
Perl一行:
find . -name "*.undo" -ls | perl -lane '$t += $F[6]; END{print $t}'
@F
autosplit数组开始于索引$F[0]
而awk字段以$ 1开始,因此使用$F[6]
而不是awk的$7
du -c | awk'/./{line=$0} END {print $ 1}'
我认为xargs的版本可以修改(简化)ls -1 * .undo | xargs wc
检查du (磁盘使用情况)命令。