如何计算位于不同目录中的多个文件的总大小? 我有一个文本文件,其中包含文件的完整路径和名称。 我想一个简单的脚本使用,而读取线和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
答案 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的内部命令)是特定于平台的位。