Chinaunix

标题: 怎么统计一个文件列表里的文件的总大小? [打印本页]

作者: killua    时间: 2004-10-29 18:14
标题: 怎么统计一个文件列表里的文件的总大小?
  1. cat filelist
  2. /usr/src/linux/xxxx
  3. /tmp/aaaa
  4. /usr/local/etc/ffff
  5. /var/log/oooo

  6. cat filelist |while read line ; do cat $line;done |wc -c
复制代码

但这样的效率很低很低,文件一大就不能这样了
比如现在我所要统计的是个100M以上的文件列表


  1. #!/bin/bash
  2. COUNTER=0;
  3. cat filelist |while read line ;do
  4. SIZE=$(ls -l $line 2>/dev/null|awk '{print $5}')
  5.    if [ $? !-eq 0 ] ;then
  6.      COUNTER=$(expr "$COUNTER" + "$SIZE")
  7.         echo
  8.    fi
  9. done
  10. echo $COUNTER
复制代码

上面的经过测试,好想不行,说是expr无法计算,不知道我有没有写错
大家有什么其他方法吗?希望不吝共享之,谢谢
作者: 寂寞烈火    时间: 2004-10-29 18:18
标题: 怎么统计一个文件列表里的文件的总大小?
ls -l|awk '{size+=$5}END{print size}'
or
cat /path/*|wc -c
作者: xchen301    时间: 2004-10-29 18:38
标题: 怎么统计一个文件列表里的文件的总大小?
原帖由 "寂寞烈火" 发表:
ls -l|awk '{size+=$5}END{print size}'
or
cat /path/*|wc -c


强啊!!!
作者: killua    时间: 2004-10-30 11:04
标题: 怎么统计一个文件列表里的文件的总大小?
原帖由 "寂寞烈火" 发表:
ls -l|awk '{size+=$5}END{print size}'
or
cat /path/*|wc -c


你这个只针对文件都在同个目录下的啦,如果不同路径就不行了

我上面的例子有写是不同文件路径的呀,我只是想问不同路径的话,是否一定要用循环,我的那个文件列表有100多M啦,也就是说那个文件列表大概有100W行,而文件列表里的文件可能是10G,或者更多,用cat显然会造成死进程
  1. cat filelist|while read line ; do ls -l $line 2>/dev/null|awk '{print $5}';done|awk '{size+=$1}END{print size}'  
复制代码
这个也很慢哎,晕了
作者: killua    时间: 2004-10-30 11:30
标题: 怎么统计一个文件列表里的文件的总大小?
一分钟处理2300行(dell 1750、RHEL-AS2(U2))一小时处理138000行

如果我的文件列表有100W行,就需要7个小时,我晕昏
作者: 随风漂    时间: 2004-10-30 12:47
标题: 怎么统计一个文件列表里的文件的总大小?
真不明白,你干吗要扫描文件的内容呢?
如果是不同的目录大不了,进入到不同的目录中多统计几次,将这几次的统计结果汇总就可以了.
作者: lightspeed    时间: 2004-10-30 13:16
标题: 怎么统计一个文件列表里的文件的总大小?
如果文件没有规律, 必须要按 filelist 统计的话,可以这样,会快很多。
下面是个 100 万行的例子:


# wc -l filelist
1050007

# time cat filelist | xargs du -sck |grep total | awk '{i+=$1} End { print "Total size: "i" KB"}'
Total size: 1.84197e+10 KB

real        6m53.643s
user       2m41.444s
sys         4m2.729s
作者: xinqingchaguan    时间: 2012-06-19 10:48
cat filelist|awk '{print "ls -ltr " $1}'|sh|awk '{size+=$5}END{print size}'
作者: jason680    时间: 2012-06-19 12:53
回复 1# killua

SIZE=$(cat filelist | xargs ls -l 2>/dev/null |awk '{sum+=$5}END{print sum}')




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2