de linuxmanr4, 8 meses han pasado desde su publicación, escrito en Bash.
Insertar vínculo
  1. #!/bin/bash
  2. set -e
  3.  
  4. # Uso:
  5. #   rsp.sh [--parallel=N] [opciones de rsync]
  6. #
  7. # Options:
  8. #   --parallel=N         Utiliza N procesos paralelos para transferir los archivos.
  9. #                    El valor por defualt es de 10.
  10. #
  11. # Notas:
  12. #   * Requiere GNU Parallel
  13. #   * Utilizar este script con ssh-keys = Un montón de solicitudes de contraseña.
  14. #   * Primero hace una lista de los archivos que han cambiado, luego parte esta
  15. #     lista en N pedazos y le encarga a rsync la copia de cada uno de esos pedazos.
  16. #   * Hay que tener cuidado con las con las opciones que pasan a través de rsync.
  17. #     las normales va a funcionar, es posible que desee probar opciones extrañas
  18. #     por adelantado.
  19. #  
  20. #   Gracias a rcoup por este script https://gist.github.com/rcoup/5358786
  21. #
  22.  
  23. if [[ "$1" == --parallel=* ]]; then
  24.         PARALLEL="${1##*=}"
  25.         shift
  26. else
  27.         PARALLEL=10
  28. fi
  29. echo "Utilizando $PARALLEL procesos para la transferencia de archivos..."
  30.  
  31. TMPDIR=$(mktemp -d)
  32. trap "rm -rf $TMPDIR" EXIT
  33.  
  34. echo "Calculando la lista de archivos..."
  35. # sorted by size (descending)
  36. rsync $@ --out-format="%l %n" --no-v --dry-run | sort -n -r > $TMPDIR/files.all
  37.  
  38. # check for nothing-to-do
  39. TOTAL_FILES=$(cat $TMPDIR/files.all | wc -l)
  40. if [ "$TOTAL_FILES" -eq "0" ]; then
  41.         echo "Nada que transferir :)"
  42.         exit 0
  43. fi
  44.  
  45. function array_min {
  46.         # return the (index, value) of the minimum element in the array
  47.         IC=($(tr ' ' '\n' <<<$@ | cat -n | sort -k2,2nr | tail -n1))
  48.         echo $((${IC[0]} - 1)) ${IC[1]}
  49. }
  50.  
  51. echo "Generando los pedazos..."
  52. # declare chunk-size array
  53. for ((I = 0 ; I < PARALLEL ; I++ )); do
  54.         CHUNKS["$I"]=0
  55. done
  56.  
  57. # add each file to the emptiest chunk, so they're as balanced by size as possible
  58. while read FSIZE FPATH; do
  59.         MIN=($(array_min ${CHUNKS[@]}))
  60.         CHUNKS["${MIN[0]}"]=$((${CHUNKS["${MIN[0]}"]} + $FSIZE))
  61.         echo $FPATH >> $TMPDIR/chunk.${MIN[0]}
  62. done < $TMPDIR/files.all
  63.  
  64. find "$TMPDIR" -type f -name "chunk.*" -printf "\n*** %p ***\n" -exec cat {} \;
  65.  
  66. echo "Iniciando la transferencia de archivos..."
  67. find "$TMPDIR" -type f -name "chunk.*" | parallel -j $PARALLEL -t --verbose --progress rsync --files-from={} $@