Linux - 不同目录中文件的总和

时间:2017-10-04 05:44:10

标签: linux bash unix

如何计算位于不同目录中的多个文件的总大小? 我有一个文本文件,其中包含文件的完整路径和名称。 我想一个简单的脚本使用,而读取线和du -h可能会做到这一点......

Example of text file (new2.txt) containing list of files to sum:

/mount/st4000/media/A/amediafile.ext
/mount/st4000/media/B/amediafile.ext
/mount/st4000/media/C/amediafile.ext
/mount/st4000/media/D/amediafile.ext
/mount/st4000/media/E/amediafile.ext
/mount/st4000/media/F/amediafile.ext
/mount/st4000/media/G/amediafile.ext
/mount/st4000/media/H/amediafile.ext
/mount/st4000/media/I/amediafile.ext
/mount/st4000/media/J/amediafile.ext
/mount/st4000/media/K/amediafile.ext

注意:文件夹结构不一定是连续的,如A..K

根据AndreaT的建议,稍微调整一下,我试过

while read mediafile;do du -b "$mediafile"|cut -f -1>>subtotals.txt;done<new2.txt

subtotals.txt看起来像

733402685
944869798
730564608
213768
13332480
366983168
6122559750
539944960
735039488
1755005744
733478912

添加所有小计

sum=0; while read num; do ((sum += num)); done < subtotals.txt; echo $sum

3 个答案:

答案 0 :(得分:0)

要对一个目录求和,您将需要执行一段时间,并将结果导出到父shell。 我使用了一个回声和随后的eval:

    eval ' let sum=0$(
       ls -l | tail -n +2 |\
         while read perms link user uid size date day hour name ; do 
          echo -n "+$size" ; 
         done
     )'

它生成一条直接评估的线,看起来像

let sum=0+205+1201+1201+1530+128+99

您只需要在两个文件夹上重现两次此命令。

答案 1 :(得分:0)

假设文件输入是这样的

/home/administrator/filesum/cliprdr.c 
/home/administrator/filesum/cliprdr.h 
/home/administrator/filesum/event.c 
/home/administrator/filesum/event.h 
/home/administrator/filesum/main.c 
/home/administrator/filesum/main.h 
/home/administrator/filesum/utils.c 
/home/administrator/filesum/utils.h

,命令ls -l的结果是

-rw-r--r-- 1 administrator administrator 13452 Oct  4 17:56 cliprdr.c
-rw-r--r-- 1 administrator administrator  1240 Oct  4 17:56 cliprdr.h
-rw-r--r-- 1 administrator administrator  8141 Oct  4 17:56 event.c
-rw-r--r-- 1 administrator administrator  2164 Oct  4 17:56 event.h
-rw-r--r-- 1 administrator administrator 32403 Oct  4 17:56 main.c
-rw-r--r-- 1 administrator administrator  1074 Oct  4 17:56 main.h
-rw-r--r-- 1 administrator administrator  5452 Oct  4 17:56 utils.c
-rw-r--r-- 1 administrator administrator  1017 Oct  4 17:56 utils.h

最简单的命令是:

cat filelist.txt | du -cb | tail -1 | cut -f -1 

以下输出(以字节为单位)

69370

请记住,du打印的实际磁盘使用率向上舍入为(通常)4kb的倍数,而不是逻辑文件大小。 对于小文件,此近似值可能无法接受。

答案 2 :(得分:0)

du命令在我可用的unix系统上没有-b选项。还有其他方法可以获得文件大小。

假设你喜欢在bash中使用while循环的想法,可能会有以下工作:

#!/bin/bash

case "$(uname -s)" in
  Linux)        stat_opt=(-c '%s') ;;
  *BSD|Darwin)  stat_opt=(-f '%z') ;;
  *) printf 'ERROR: I don'\''t know how to run on %s\n' "$(uname -s)" ;;
esac

declare -i total=0
declare -i count=0
declare filename

while read filename; do
  [[ -f "$filename" ]] || continue
  (( total+=$(stat "${stat_opt[@]}" "$filename") ))
  (( count++ ))
done

printf 'Total: %d bytes in %d files.\n' "$total" "$count"

这会将您的文件列表作为标准输入。您可以在BSD unix或Linux中运行它 - stat命令的选项(不是bash的内部命令)是特定于平台的位。