1

ディレクトリのすべてのファイルを各グループ サイズが 1 GB のグループに分割する 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'

動作しますが、非常に遅いです。誰でも私を助けて、それをより速くする方法を教えてもらえますか? ありがとう

4

1 に答える 1

0

以下は私のいくつかの提案です。私はそれらを自分で実装していないため、パフォーマンスがどのように改善されるかはわかりませんが、高速化する方法についてアドバイスをいただければ幸いです。

  • 交換すると最初のループを回避できます

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

2番目のループで:

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

  • 一時ファイルfilesを置き換えると回避できます

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

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

${files[$item]}と置き換え${file}ます。

  • ファイルのサイズのチェックは、代わりに次の場合に回避できます。

find "$path" -type f

あなたが使う

find "$path" -type f -ls

名前とサイズで列を抽出します。

于 2013-05-08T16:22:52.283 に答える