Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.20 KB | None | 0 0
  1. declare -a files_list
  2. files_list=($(find $find_options -type f -printf "%s %pn" | sort -gr))
  3.  
  4. # хэш { 'имя_части' => сумма размеров файлов }
  5. declare -A file_sizes
  6. # этот массив используется для сохранения порядка обхода хэша
  7. declare -a part_files
  8. # инициализируем хэш и массив:
  9. for(( i = 0; i < $parts_number; i++ )); do
  10. part_files[$i]="$(tempfile -p 'prs-' -s '.include')"
  11. file_sizes[${part_files[$i]}]=0
  12. done
  13.  
  14. declare -a files_list
  15. files_list=($(find $find_options -type f -printf "%s %pn" | sort -gr))
  16.  
  17. while [ ${#files_list[*]} -gt 0 ]; do
  18.  
  19. for(( i = 0; i < $(($parts_number-1)); i++ )); do
  20.  
  21. # в списке элементы идут в порядке [ размер, имя ]:
  22. file_name="${files_list[1]}"
  23. # проверку можно сделать и по-другому, но это неважно:
  24. if [ -z "$file_name" ]; then break; fi
  25. file_size="${files_list[0]}"
  26. # удаляем из списка файлов 2 первых элемента
  27. files_list=("${files_list[@]:2}")
  28.  
  29. file1=${part_files[$i]}
  30. file2=${part_files[$(($i+1))]}
  31.  
  32. # основной проход, если сумма в текущем элементе меньше
  33. # суммы в следующеем - сохраняем файл сюда, иначе
  34. # в следующий элемент:
  35. if [ "${file_sizes[$file1]}" -lt "${file_sizes[$file2]}" ]; then
  36. echo "$file_name" >> "$file1"
  37. file_sizes[$file1]=$((${file_sizes[$file1]}+$file_size))
  38. else
  39. echo "$file_name" >> "$file2"
  40. file_sizes[$file2]=$((${file_sizes[$file2]}+$file_size))
  41. fi
  42. echo "$file_name" >> "$exclude_file"
  43. done
  44. done
  45.  
  46. # ну и сортируем хэш по значениям, получая имена списков с
  47. # файлами в порядке увеличения сумм их размеров:
  48. declare -a sorted_parts
  49. sorted_parts=($(
  50. for file_name in ${!file_sizes[@]}; do
  51. echo ${file_sizes[$file_name]} $file_name
  52. done | sort -gr | sed -e 's/^[0-9 ]*//g'
  53. ))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement