Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- declare -a files_list
- files_list=($(find $find_options -type f -printf "%s %pn" | sort -gr))
- # хэш { 'имя_части' => сумма размеров файлов }
- declare -A file_sizes
- # этот массив используется для сохранения порядка обхода хэша
- declare -a part_files
- # инициализируем хэш и массив:
- for(( i = 0; i < $parts_number; i++ )); do
- part_files[$i]="$(tempfile -p 'prs-' -s '.include')"
- file_sizes[${part_files[$i]}]=0
- done
- declare -a files_list
- files_list=($(find $find_options -type f -printf "%s %pn" | sort -gr))
- while [ ${#files_list[*]} -gt 0 ]; do
- for(( i = 0; i < $(($parts_number-1)); i++ )); do
- # в списке элементы идут в порядке [ размер, имя ]:
- file_name="${files_list[1]}"
- # проверку можно сделать и по-другому, но это неважно:
- if [ -z "$file_name" ]; then break; fi
- file_size="${files_list[0]}"
- # удаляем из списка файлов 2 первых элемента
- files_list=("${files_list[@]:2}")
- file1=${part_files[$i]}
- file2=${part_files[$(($i+1))]}
- # основной проход, если сумма в текущем элементе меньше
- # суммы в следующеем - сохраняем файл сюда, иначе
- # в следующий элемент:
- if [ "${file_sizes[$file1]}" -lt "${file_sizes[$file2]}" ]; then
- echo "$file_name" >> "$file1"
- file_sizes[$file1]=$((${file_sizes[$file1]}+$file_size))
- else
- echo "$file_name" >> "$file2"
- file_sizes[$file2]=$((${file_sizes[$file2]}+$file_size))
- fi
- echo "$file_name" >> "$exclude_file"
- done
- done
- # ну и сортируем хэш по значениям, получая имена списков с
- # файлами в порядке увеличения сумм их размеров:
- declare -a sorted_parts
- sorted_parts=($(
- for file_name in ${!file_sizes[@]}; do
- echo ${file_sizes[$file_name]} $file_name
- done | sort -gr | sed -e 's/^[0-9 ]*//g'
- ))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement