0
我的Bash脚本将目录中的所有文件拆分为组,每个组的大小为1GB。Bash,按目录将文件从目录拆分为组(大小不一)
我有一个脚本,看起来像这样:
#!/bin/bash
path=$1
unset i
echo $path start
fpath=`pwd`"/files"
find "$path" -type f>files
max=`wc -l $fpath | awk '{printf $1}'`
while read file; do
files[i]=$file
size[i]=$(du -s $file | awk '{printf $1}')
((i++))
echo -ne $i/$max'\r'
done < `pwd`"/files"
echo -ne '\n'
echo 'sizes and filenames done'
unset weight index groupid
for item in ${!files[*]}; do
weight=$((weight+${size[$item]}))
group[index]=${files[$item]}
((index++))
if [ $weight -gt "$((2**30))" ]; then
((groupid++))
for filename in "${group[@]}"
do
echo $filename
done >euenv.part"$groupid"
unset group index weight
fi
done
((groupid++))
for filename in "${group[@]}"
do
echo $filename
done >euenv.part"$groupid"
echo 'done'
它的工作原理,但它是非常缓慢的。任何人都可以帮助我,并给我一些建议如何使其更快? 谢谢
如果您有两个彼此相邻的文件,每个文件都是1GiB - 1个字节,则两个文件都将包含在您的组中,而每个文件可能应该是一个组。我相信,在将文件添加到组之前,您应该检查新的权重。如果按递减顺序对文件进行排序,您也可以执行打包算法,在总数小于限制(应该只计算一次,但不是速率限制因子)的情况下向文件组中添加新文件。通过较少运行'du'和'awk'可以获得主要的加速。 – 2013-05-08 16:52:42