计算shell中文件的大小

时间:2009-03-01 00:57:52

标签: linux shell

我正在尝试计算仅使用shell匹配文件名模式的所有文件(在目录树中)的总大小(以字节为单位)。这就是我到目前为止所做的:

  

find -name * .undo -exec stat -c%s {} \; | awk'{total + = $ 1} END {print total}'

有更简单的方法吗?我觉得应该有一个简单的du或find开关为我做这个,但我找不到。

要明确我想要在目录树下的任何位置匹配模式的文件,这意味着

  

du -bs * .undo

将无效,因为它只匹配当前目录中的文件。

15 个答案:

答案 0 :(得分:95)

尝试:

find . -name "*.undo" -ls | awk '{total += $7} END {print total}'

在我的系统上,文件的大小是find -ls输出中的第七个字段。如果您的find … -ls输出不同,请调整。

在此版本中,使用现有目录信息(文件大小)和find的内置ls功能应该是高效的,避免进程创建或文件i / o。

答案 1 :(得分:35)

使用zsh,您可以使用扩展的globbing来执行:

du -c ** / *。撤消

答案 2 :(得分:22)

find -name *.undo -print0 | du -hc --files0-from=-

答案 3 :(得分:18)

du -c *pattern*

这将在最后一行输出中打印总数。

答案 4 :(得分:9)

我也一直在关注这个问题(仅一年后......) - 只是发现了这个页面。

我找到的东西(对我来说)有以下几点:

find /mnt/iso -name *.avi -printf "%s\n" | paste -sd+ - | bc

这将返回/ mnt / iso

下所有子文件夹中所有.avi文件的总大小

我必须赞扬radoulov的粘贴命令 - 请参阅此页: Shell command to sum integers, one per line?

只是添加 - 以防文件夹与搜索字词匹配 - 最好在find命令中使用-type f

答案 5 :(得分:8)

find -name '*.undo' -exec wc -c {} + | tail -n 1

应该给出文件中的实际总字节数,如果你没有太多的文件(“太多”将是一个非常大的数字,可能是数千)。或者,如果您只是想单独获取数字,

find -name '*.undo' -exec wc -c {} + | tail -n 1 | cut -d' ' -f 1

答案 6 :(得分:5)

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

龙眼,但非常清晰,高度可扩展。

答案 7 :(得分:3)

find -name '*.undo' -print0 | du -hc --files0-from=- | tail -n 1

汇总gerdemb和strager的贡献。使用du -cb应显示字节。

答案 8 :(得分:2)

我使用这样的du命令来获取数字:

du file_list | awk '{s+=$1} END {print s}'

答案 9 :(得分:0)

这个简单的怎么样。

find ./ -name *.undo | xargs wc

答案 10 :(得分:0)

或者,您可以这样做:

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 

只评估表达式。

答案 11 :(得分:0)

Perl one-liner:

find . -name "*.undo" -ls | perl -lane '$t += $F[6]; END{print $t}'

@F autosplit数组从索引$F[0]开始,而awk字段以$ 1开头,因此使用$F[6]代替awk' s $7

答案 12 :(得分:0)

du -c | awk'/./ {line = $ 0} END {print $ 1}'

答案 13 :(得分:0)

我认为xargs的版本可以被改进(简化) ls -1 * .undo | xargs wc

答案 14 :(得分:-3)

检查du(磁盘使用情况)命令。