2013-05-08 60 views
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' 

它的工作原理,但它是非常缓慢的。任何人都可以帮助我,并给我一些建议如何使其更快? 谢谢

+0

如果您有两个彼此相邻的文件,每个文件都是1GiB - 1个字节,则两个文件都将包含在您的组中,而每个文件可能应该是一个组。我相信,在将文件添加到组之前,您应该检查新的权重。如果按递减顺序对文件进行排序,您也可以执行打包算法,在总数小于限制(应该只计算一次,但不是速率限制因子)的情况下向文件组中添加新文件。通过较少运行'du'和'awk'可以获得主要的加速。 – 2013-05-08 16:52:42

回答

0

下面是我的一些建议,我自己没有实现它们,所以我不能告诉他们性能会有什么改进,但我希望他们会给你建议如何使它更快。

  • 第一个循环,可避免当你更换

weight=$((weight+${size[$item]}))

在第二循环中:

size=$(du -s ${files[$item]} | awk '{printf $1}')

  • 临时文件可避免files什么时候更换

for item in ${!files[*]}; do

find "$path" -type f | while read file

${file}取代${files[$item]}

  • 检查文件的大小可以使用

    find "$path" -type f -ls

    ,并提取了列的名称和大小来避免

find "$path" -type f

,而不是当。