2009-03-01 83 views
51

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

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

有没有更简单的方法来做到这一点?我觉得应该有一个简单的杜或找到开关,这对我来说,但我找不到一个。

要清楚,我想总文件的目录树,这意味着下的任何地方匹配模式的

杜-bs * .undo

不会工作,因为它只会匹配文件在当前目录中。

+0

无论如何,`du`(或`ls`)将无法在几千个文件(“参数列表太长”错误)之上工作。 – 2013-08-14 09:36:48

回答

94

尝试:

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

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

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

-3

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

18
du -c *pattern* 

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

+1

并使用tail修剪除最后一行外的所有行。 +1。 =] – strager 2009-03-01 01:29:28

+6

虽然 - 只会找到与当前目录中的模式匹配的文件 - 不是吗? – 2009-03-01 03:14:53

+0

您可以使用类似`*/*。undo`的模式...尽管只能找到具有深度扩展名的撤消扩展名的文件...在当前目录中也找不到任何文件。 – Kasapo 2014-08-05 14:51:42

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

应给予的实际字节总数中的文件,如果你没有太多的文件(其中“太多”将是一个非常大的数字,大概在千元)。或者如果你只是想获得这个号码,

find -name '*.undo' -exec wc -c {} + | tail -n 1 | cut -d' ' -f 1 
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 

很长,但非常清晰,高度可扩展。

35

随着zsh中,您可以使用通配符扩展做:

杜-c **/*撤消

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

gerdemb的和strager的贡献放在一起。使用du -cb应显示字节。

9

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

的东西,我发现作品(对我来说)如下:

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

这将返回所有.avi文件的总大小在下面的/ mnt所有子文件夹/ ISO

我必须给予信贷radoulov的粘贴命令 - 看到这个页面: Shell command to sum integers, one per line?

我想补充 - 以防万一某个文件夹匹配的搜索词 - 它在find命令使用-type f一个好主意太。

0

这个简单的怎么样。

find ./ -name *.undo | xargs wc 
2

我用杜类似下面的命令只得到数:

du file_list | awk '{s+=$1} END {print s}' 
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 ." 

当统计显示一个文件或文件系统状态。参数-c表示使用指定格式而不是默认格式,格式序列$ s允许显示总字节数。

expr 

只是评估一个表达式。

0

Perl的单行:

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

@F自动分割阵列在索引$F[0]开始而AWK字段以$ 1开始,因此$F[6]是用来代替awk的$7

0

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

0

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