2014-02-24 23 views
16

我想运行一个find命令,该命令将查找某个文件列表,然后遍历该文件列表以运行某些操作。我也想找到列表中所有文件的总大小。在UNIX中获取文件列表的总大小

我想先制作文件列表,然后做其他操作。有没有简单的方法可以报告列表中所有文件的总大小?

从本质上说,我试图找到一个班轮在下面的代码片段“TOTAL_SIZE”变量:

#!/bin/bash 
loc_to_look='/foo/bar/location' 

file_list=$(find $loc_to_look -type f -name "*.dat" -size +100M) 

total_size=??? 

echo 'total size of all files is: '$total_size 

for file in $file_list; do 
     # do a bunch of operations 
done 
+1

你可以用'printf的 “%P%S \ n”'在'find'命令显示名称+大小。 – fedorqui

+0

@fedorqui如果她的'find'版本支持'-printf'。某种形式的'-exec stat -f'%z'{} \;'(取决于你系统对'stat'的实现)也可以。 – chepner

+0

@fedorqui:在for循环之前,您还必须分割文件名和大小...... – sanmiguel

回答

25

您应该简单地能够通过$file_listdu

du -ch $file_list | tail -1 | cut -f 1 

du选项:

  • -c d显示总数
  • -h人类可读的(即, 17M)

du将打印每个文件中的条目,其次是共(伴-c),所以我们使用tail -1修剪到只有最后一行cut -f 1该行修剪仅第一列。

+0

谢谢@sanmiguel!我把这个命令反引号给了变量:D – HotDogCannon

+0

啊,是的,这可能也有帮助... – sanmiguel

+1

这是一个很好的答案,但请记住'du'打印的实际磁盘使用量取四舍五入(通常是4) KB而不是逻辑文件大小。 '为我在{0..9};做echo -n $ i> $ i.txt;完成; du -ch * .txt' =>总共40K,而不是总共10个。 – nodakai

1

此代码对所有文件的信赖LS加起来的所有字节(它排除所有目录......显然他们8KB每个文件夹/目录)

cd /; find -type f -exec ls -s \; | awk '{sum+=$1;} END {print sum/1000;}' 

注: EXECUTE AS根。结果以兆字节为单位。

11

这里解释的方法有隐藏的bug。当文件列表很长时,它超出了shell命令大小的限制。更好地利用这一个使用DU:

find <some_directories> <filters> -print0 | du <options> --files0-from=- --total -s|tail -1 

发现产生空端文件列表中,都需要从标准输入和计数。 这与shell命令大小限制无关。 当然,您可以添加一些开关来获取逻辑文件大小,因为默认情况下,du会告诉您空间文件的物理空间大小。

但我认为这不是程序员的问题,但对于Unix管理员:)然后为stackoverflow这是没有主题。

+2

这是迄今为止最好的答案。不需要awk或shell变量。 – EMiller

0

ls -l | tr -s''|切-d''-f是我用了很多东西。

第五个字段是大小。将该命令放入for循环并将大小添加到累加器,您将获得目录中所有文件的总大小。更容易学习AWK。另外,在命令替换部分,你可以通过grep来限制你要查找的内容(^ - 用于文件等等)。

总= 0

在$大小(LS -l | TR -s '' |切-d '' -f 5); do total = $(($ {total} + $ {size}));做

回声$ {}总

+0

答案可能正确,但为了让别人理解,请添加一些文字以很好的方式描述。 –