Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/07/2010, à 22:31

Zakhar

tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

Allez, encore une méthode pour recoller vos XTM favoris.

L'idée m'est venue à la lecture des efforts de zedtux pour réaliser un programme natif Linux permettant ce recollage.
Voir le fil ici : http://forum.ubuntu-fr.org/viewtopic.php?id=34185

En ce qui me concerne, j'aime bien les trucs faits à base de scripts, car c'est facile à modifier par soi-même si on veut un peu personnaliser.

Il faut dire aussi que je ne vois pas non plus très clair dans le post de zedtux... 28 pages... et on n'est pas complètement sûr que le post de la page 1 soit bien à jour. En effet, j'ai récupéré un utilitaire qui a fonctionné (en ligne de commande), mais m'a craché une erreur inquiétante !

J'ai donc décidé de me lancer par moi-même et d'écrire un script pour le recollage des fichier XTM.

Voyant la documentation sur le site de référence (http://xtremsplit.fr/xtremsplit-develop … n-xtm.html), cela paraissait assez abordable car le format est relativement simple.

Bien sûr il s'agit de recoller. Pour découper, je ne prendrais jamais la peine de faire un tel script car j'estime que c'est un format un peu bidon et passablement spécifique. Il est bien mieux d'utiliser des formats tels que RAR + PAR2 qui sont bien plus commun, répandus et efficaces (puisque avec le PAR2, non seulement on détecte les erreurs, mais on les répare).

Donc voici le script.

Vous êtes bienvenus à améliorer (si vous le souhaitez), ou faire toute suggestion utile.

Il présente peu limitations connues. Elles sont indiquées par /TODO en commentaire.

Il présente aussi un GROS avantage par rapport à la version wine : c'est à peu près deux fois plus rapide !

Chrono sur un fichier d'environ 8Gio :
- Wine/XtremSplit = 6m08
- tuXtremSplit = 3m07 !

Evolutions possibles : voir post #13


Cette première page contiendra toujours la dernière version du script !
(mes améliorations, ou vos contributions)

History

Version 0.9.0 du 16 juillet 2010
Version 1.0.0 du 19 juillet 2010
Version 1.0.1 du 19 juillet 2010
Version 1.1.0 du 26 juillet 2010
Version 1.2.0 du 26 juillet 2010
Version 1.5.0 du 30 décembre 2010
Version 1.5.1 du 30 décembre 2010
Version 1.5.2 du 10 janvier 2011
Version 1.5.3 du 10 avril 2011
Version 1.5.4 du 25 avril 2011
Version 1.5.5 du 25 avril 2011
Version 1.6.0 du 21 mai 2011
Version 1.6.1 du 25 mai 2011
Version 1.6.2 du 21 juin 2011
Version 1.7.0 du 24 septembre 2011

Version 1.7.1 du 21 janvier 2012 (le présent script)

FONCTIONS UNIQUES !
A partir de la version 1.2.0, le script dispose de 2 fonctions uniques qui n'existent pas sur l'original XtremSplit.
A partir de la version 1.6.0, le script dispose d'une 3ème fonction unique (NAS) qui n'existe pas sur l'original.

-1) Le mode TURBO ... profitez de la toute puissance de Linux !
Ce mode est automatique depuis la 1.5, il ne nécessite plus d'option.
Le principe est que la vérification MD5 et la concaténation se font en une seule étape. La lecture du fichier source ne se fait qu'une fois, et est "pipé" à la fois sur le fichier de résultat et sur md5sum.

Avantage : on gagne un temps considérable (si tous les MD5 sont corrects). En mode "Turbo", le script est deux fois plus rapide que Wine XtremSplit, et on gagne 50% sur le mode "normal" (vérification puis concaténation)


-2) Le mode Progressif ... commencez à recoller pendant le téléchargement !
Ce mode est également automatique depuis la 1.5 et ne nécessite plus d'option.
C'est particulièrement utile lorsque les fichiers constituant l'ensemble des xtm sont récupérés depuis une source "lente", comme un téléchargement.
L'option permet alors de commencer le recollage sans attendre d'avoir tout récupéré.

Conditions : il faut néanmoins avoir récupéré au moins le premier et le dernier fichier (pour les MD5 ou la vérification de cohérence des tailles).
L'ordre de récupération idéal des fichiers doit donc être : dernier, 1er, 2ème, 3ème, ...., avant-dernier.

L'option va alors concaténer les fichiers qui sont entiers et dont le MD5 est correct.
On peut la relancer autant de fois que nécessaire, à chaque fois les nouveaux fichiers entiers sont ajoutés au résultat.

Avantages : si c'est le film des vacances du cousin, on peut visionner le début sans attendre... un peu comme une "bande annonce"... et éventuellement ne pas poursuivre le téléchargement si ça ne plaît pas (en général, les films perso des vacances du cousin sont pas terribles !).
Cela permet aussi de commencer à regrouper les fichiers pendant le téléchargement, et ainsi une fois que le téléchargement se termine, il ne reste que quelques fichiers à regrouper, et l'opération est plus rapide.


-3) Fonctionne directement sur votre NAS (Synology, QNAP...) ... sans perdre de temps en transferts réseau
Désormais, pour alléger ce post, les instructions détaillées pour les NAS sont sur le deuxième post.
Votre NAS est doté de fonctions lui permettant de télécharger sans qu'un PC ait besoin d'être allumé. C'est très pratique (un peu comme la Freebox V6, mais en mieux !).
Le problème, si les fichiers que vous récupérez sont des xtm, est qu'avec tous les autres programmes classiques, il vous faudra transférer les .xtm vers votre PC, procéder à leur "recollage", et retransférer à nouveau sur le NAS. Selon la vitesse de votre réseau, plusieurs précieuses minutes de perdues !..

Mais pas de problème, comme la méthode que j'ai développée est basée sur du script et n'utilise que des utilitaires GNU communs et présents à peu près partout, le script fonctionne directement sur votre NAS !

A titre d'estimation, un fichier de 3G rassemblé sur Synology DS1010+
- Script = 1min 30
- XtremSplit = 4min 15
(Soit presque trois fois plus rapide que la version Windows pour ce cas d'usage !)

Tous les détails pour le fonctionnement sur NAS ainsi que sur les NAS où cela a été testé sont sur le post suivant (#2).

N'hésitez pas à témoigner :
- si ça fonctionne sur votre NAS, indiquez la référence du NAS : marque, modèle (et si possible O.S.)
- si ça ne fonctionne pas et que vous voulez debuger : soit directement dans le code, soit sur ce forum, auquel cas, laissez un message.


AUTRES FONCTIONS
- Préciser un nom de fichier destination ou un répertoire de destination
- Ne vérifier que les MD5 (pas d'écriture de fichier)
- Ignorez les MD5 (à vos risques et périls !)
- etc...

Pour le détail de ces fonctions vous pouvez consulter l'aire en lançant le script avec l'option -h

Télécharger le script (Faites un clic droit pour sauvegarder)

ou copier/coller le source (GPL V2)

#!/bin/bash
# Copyright (C) 2010,2011,2012 Zakhar for ubuntu-fr

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.

# The text of the GNU General Public License is available at
# http://www.gnu.org/licenses/gpl-2.0.html; if you cannot access it,
# write to the Free Software Foundation, Inc., 51 Franklin Street,
# Fifth Floor, Boston, MA 02110-1301 USA.
#===========================================================

# Fonction :
# ----------
#  - Rassemble des fichiers découpés par XtremSplit
#  - Vérifie le MD5 s'il est inclus dans les fichiers source
#
# Usage :
# -------
#  tuXtremMerge Nom_Du_Fichier_NNN.xtm
#   (N'importe lequel des fichiers fonctionne : 001 ou autre)
#
# Tested : Ubuntu Lucid,Karmic, Busybox (Synology DS211j, DS1010+, DS411+, DS209, DS211+)
# ------
#
# Version : 1.7.1
# -------
#
# Date : 2012-01-21
# -----
#
# Author : Zakhar (ubuntu-fr)
# ------
#
# Contributor :  // Ajouter votre nom si vous contribuez et redistribuez //
# -----------
#  Hypnose @ ubuntu.fr : amélioration des spécifications
#  Totor @ ubuntu.fr : amélioration et optimisation du code
#  Moonface @ ubuntu.fr : témoignage, test et debug de fonctionnement sur Synology DS211j
#  stadros83 @ ubuntu.fr : debug sur Synology DS1010+ (merci pour la patience !)
#                          A partir de là, certaines spécificités Synology (Busybox) sont
#                          dans le script "compagnon" busyXtremMerge
#  zootroopa @ ubuntu.fr : debug et test sur Synology DS411+
#  Gajo22 @ ubuntu.fr : témoignage sur Synology DS209 = OK (après installation coreutils)
#  NiKo88 @ ubuntu.fr : témoignage sur Synology DS211+
#  Respawner @ ubuntu.fr : aide pour le format des .exe
#  Hizoka @ ubuntu.fr : signalement de bug pour noms de fichiers bizarres !
#  Josh63 @ ubuntu.fr : témoignage sur Synology DS211
#  McMyst @ ubuntu.fr : témoignage sur Dlink DNS 325
#
# History :
# ---------
#  1.7.1
#  - Correction du calcul du nom de la destination lorsque le nom du fichier source
#    contient des caractères tels que {}
#  1.7.0
#  - Prise en compte des fichiers au format .exe
#    Le différence réside seulement dans le premier fichier dont il faut retirer
#    305664 octets au début et 24 octets à la fin, pour avoir l'équivalent du xtm.
#  1.6.2
#  - Retrait du "process substitution" a profit d'une fonction avec un simple "pipe"
#    davantage compatible avec d'autres Linux (comme busybox)
#  1.6.1
#  - Simplification de la substitution du md5sum pour busybox (nécessite 1.0.1 busyXtremMerge)
#  1.6.0
#  - Modification de l'algorithme pour le premier fichier afin de le rendre compatible Busybox
#    (pas de ibs/obs sur le dd). Ainsi modifié, c'est également plus rapide sur Linux standard !
#  - Simplification algo sur le dernier fichier (idem ci-dessus).
#  - Rajout de l'option pipefail pour ne pas "masquer" les éventuelles erreurs lors des "pipes"
#    du processus de recollage.
#  1.5.6
#  - Remplacement de od par dd lorsqu'on doit lire des chaines.
#  - Remplacement de basemane par interne ${var##*/}
#  1.5.5
#  - Retour au code 1.5.3. (plus amélioration: suppression de 'du + cut' remplacé par 'stat -c%s')
#    et séparation du code non fini pour Synology 1010+
#  1.5.4
#  - Tentative du mise au point pour Synology 1010+ qui utilise une Busybox 1.16.1
#  1.5.2
#  - Suppression useless cat ! (Totor @ ubuntu.fr)
#  - Remplacement du fichier temporaire par un process substitution (Totor @ ubuntu.fr)
#  - Isolation des libellés et codes erreur.
#  - Nouveaux paramètre : V (Version), t (temps) [et donc désormais n'affiche plus par défaut les temps]
#  1.5.1
#  - Sécurité : création du fichier temporaire avec mktemp
#  - Amélioration de libellés
#  - Ordonnancement plus logique des tests de cohérence initiaux.
#  - Optimisations mineures.
#  1.5.0
#  - Suppression et fusion des options -o et -a !..
#    Le script utilise désormais toujours l'option -o (ce qui est sa plus-value)
#    Si un traitement partiel est détecté, il reprend là où ça en était (deuxième plus-value)
#    Ces deux options sont donc désormais inutiles car implicites... et cela simplifie le code !
#  - Le script fonctionne désormais "à la mode Firefox", c'est à dire que le fichier résultat
#    est d'abord écrit dans resultat.part, et celui-ci est renommé à la fin du traitement.
#    La fonction de reprise tient compte de ce nouveau fonctionnement, de même que l'option -f
#  - Le premier fichier bénéficie aussi de l'optimisation (parallelisme copie/md5)
#  1.2.0
#  - Suppression de l'option -s devenue inutile. Le fichier est maintenant mis par défaut (suggestion Hypnose @ ubuntu-fr)
#    dans le même répertoire que les fichiers source (xtm). Le mode par défaut précédent s'obtient en spécifiant "."
#    (c'est à dire le répertoire courant) comme destination.
#  - Rajout des options d'optimisation -a et -o
#    -a permet de lancer le script en cours de téléchargement et d'obtenir un résultat partiel
#    -o optimise les MD5/concaténation via un tee (tout est fait en une seule commande, une seule lecture).
#  - Diverses corrections de bugs
#  1.1.0
#  - Rajout de l'exploration des arguments
#  - Rajout des options : voir description dans la fonction usage
#  - Un peu de couleurs pour égayer l'affichage !
#  1.0.1
#  - Correction du chemin si le script est lancé depuis via PATH (exemple script placé dans /usr/local/bin)
#  - Affichage des fichiers tels que passés en paramètres avec leurs éventuels chemins relatifs/absolus
#  1.0.0
#  - Supporte d'être lancé avec des noms de fichiers contenant des chemins
#  - Deuxième paramètre optionnel pour spécifier le fichier destination
#  - Support des noms de fichiers contenant des espaces (source et destination)
#  - Vérification au préalable de l'existence du fichier destination pour éviter les écrasement intempestifs
#  - Vérification avant de calculer les MD5 qu'on va bien pouvoir écrire sur le fichier destination


#==========================================================
#  Messages and Error codes.
#+ This way it is easyier, if somebody would like to localise
readonly MSG_ERROR="\E[1;31mErreur\E[0m\n"
readonly MSG_OK="\E[1;32mOK\E[0m"
readonly MSG_ATTENTION="\E[1;33mAttention !\E[0m"

readonly MSG_BAD_OPTION='Option - incorrecte'
readonly MSG_TOO_MANY_PARAMS='Trop de paramètre :'
readonly MSG_UNKNOWN_OPTION='Option inconnue :'
readonly MSG_UNSPECIFIED_SOURCE_FILE='Fichier source non spécifié'
readonly MSG_VERSION='tuXtremMerge (turbo XTM), version 1.7.1'
readonly MSG_OPTION_M_AND_N="Vous ne pouvez spécifier les options \E[1;32m-m\E[0m et \E[1;32m-n\E[0m simultanément."
readonly MSG_IGNORING_OPTION_F="L'option \E[1;32m-f\E[0m sera ignorée puisque l'option -\E[1;32m-m\E[0m est spécifiée."
readonly MSG_IGNORING_DEST="Le nom du fichier résultat sera ignoré puisque l'option \E[1;32m-m\E[0m est spécifiée."
readonly MSG_CHECKING='Vérifications ...  '
readonly MSG_CHECKING_FIRST_SOURCE_FILE="Vérification d'existence du premier fichier source..."
readonly MSG_TIP="\E[1;34mAstuce :\E[0;34m il faut le premier et le dernier fichier, corrects et complets, pour que le script puisse fonctionner.\nVous pouvez optimiser le résultat en récupérant ces deux fichiers en priorité.\E[0m"
readonly MSG_SUCCESS="==================================================\n\E[1;32mToutes les opérations sont terminées avec succès !\E[0m"
readonly MSG_FIRST_FILE_ERROR=' non trouvé, vide ou erreur'
readonly MSG_FIRST_FILE_FOUND='Premier fichier source trouvé :'
readonly MSG_OPTION_M_AND_NO_MD5="\E[1;33mRien à faire !\E[0m\nL'option \E[1;32m-m\E[0m est spécifiée, or il n'y a pas MD5 à vérifier dans ces fichiers xtm."
readonly MSG_CHECKING_LAST_SOURCE_FILE="Vérification d'existence du dernier fichier source..."
readonly MSG_LAST_FILE_ERROR="Fichier %s%3.3u.xtm non trouvé ou vide\n"
readonly MSG_LAST_FILE_FOUND="Dernier fichier source trouvé: %s%3.3u.xtm\n"
readonly MSG_FILE_SIZES_OK='Tailles premier et dernier fichier cohérentes.'
readonly MSG_FILE_SIZES_ERROR='Premier ou dernier fichier de taille incohérente.'
readonly MSG_NO_FILE_WRITTEN="Aucun fichier résultat ne sera écrit car l'option \E[1;32m-m\E[0m est spécifiée."
readonly MSG_COMPUTING_DEST="Détermination de l'emplacement du résultat..."
readonly MSG_DISPLAY_DEST='Emplacement du résultat :'
readonly MSG_CHECK_DEST_WRITABLE="Vérification de la possibilité d'écrire le résultat : existence, autorisation d'écriture, espace disponible, etc..."
readonly MSG_WARN_FORCED_OVERWRITE="\nEcrasement forcé par l'option \E[1;32m-f\E[0m, le fichier résultat existe déjà."
readonly MSG_WARN_OVERWRITE="\nLe fichier : %s existe déjà.\n"
readonly MSG_FILE_SIZE_MATCHES='La taille du fichier correspond au résultat prévu dans le xtm.'
readonly MSG_FILE_SIZE_DOES_NOT_MATCH='La taille du fichier ne correspond pas au résultat prévu dans le xtm.'
readonly MSG_OVERWRITE_HINT="Si vous désirez ré-écrire ce fichier effacez/renommez-le au préalable ou spécifiez l'option \E[1;32m-f\E[0m pour forcer l'écrasement"
readonly MSG_WRITE_ERROR="Ecriture de : %s impossible.\nVeuillez vérifier que vous avez l'autorisation d'écrire ce fichier et que son nom est correct.\n"
readonly MSG_INSUFFICIENT_SPACE="Espace insuffisant sur %s pour créer le fichier %s.\nEspace nécessaire : %'u\nEspace disponible : %'u\n" 
readonly MSG_CHUNKS_AVAIL='fichiers déjà traités.'
readonly MSG_INFO_DELETED_OLD_FILE="Fichier partiel incohérent supprimé par option \E[1;32m-f\E[0m"
readonly MSG_INCOHERENT_PARTIAL_FILE="La taille du fichier partiel n'est pas un multiple de la taille de découpage des fichiers xtm.\nSupprimez ce fichier (%s.part) ou utilisez l'option \E[1;32m-f\E[0m\n"
readonly MSG_ALL_CHECKED_OK='Vérifications pour le fichier résultat terminées.'
readonly MSG_PROCESSING_START="\E[1mTraitement optimisé des %u fichiers\E[0m\n"
readonly MSG_PROCESSING_RESTART="\E[1mReprise du traitement à partir du fichier %u\E[0m\nReste à traiter %u fichier(s)\n"
readonly MSG_SEPARATOR='=================================='
readonly MSG_PROCESSING_FILE='Traitement de %s%3.3u.%s ...  '
readonly MSG_FILE_MISSING='*** Le fichier est manquant ou de taille incorrecte.'
readonly MSG_FILE_MISSING_TIP='*** Relancez le programme lorsque le fichier sera complet.'


readonly E_BAD_OPTION=65
readonly E_UNKNOWN_OPTION=66
readonly E_TOO_MANY_PARAMS=67
readonly E_UNSPECIFIED_SOURCE_FILE=68
readonly E_MSG_OPTION_M_AND_N=69
readonly E_FIRST_FILE_ERROR=80
readonly E_LAST_FILE_ERROR=81
readonly E_FILE_SIZES_ERROR=82
readonly E_WRITE_ERROR=83
readonly E_INSUFFICIENT_SPACE=83
readonly E_INCOHERENT_PARTIAL_FILE=84
readonly E_WARN_OVERWRITE=96
readonly E_CRITICAL_ERROR=127

#==========================================================
# Utility functions
# usage : affiche l'usage/aide du script
# v_echo : affichage pour l'option verbeux

usage()
{
  if [ -n "$1" ]; then echo "$1"; fi
  cat <<EOF
Usage : tuXtremMerge [Options] Source [Destination]

Source : le fichier source, généralement de la forme [chemin/]fichier.001.xtm
         On peut cependant indiquer n'importe lequel des xtm de la série, par
         exemple fichier.007.xtm

Destination : nom du fichier destination souhaité.
         Si la destination est un répertoire existant, le fichier résultat sera
         stocké dans ce répertoire, avec le nom indiqué au découpage en xtm.
         Par défaut, le fichier résultat est stocké dans le répertoire du
         fichier source et porte le nom indiqué lors du découpage en xtm.

Options :
 -h  Affiche le présent message d'aide.
 -n  Ne vérifie pas les md5 (concaténation sans vérifier).
 -m  Vérifie seulement les md5 (pas de concaténation)
 -f  Force l'écriture du fichier résultat.
     Si un fichier existe déjà il est écrasé.
 -v  Verbeux. Permet aussi de diagnostiquer les incohérences entre options.
 -t  Temps. Affiche les heures de début et fin de traitement.
     Doublé (tt) affiche davantage de temps intermédiaires.
 -V  Affiche la version du script.

ASTUCE :
 Dans tous les cas, le premier et le dernier fichier sont nécessaires pour
 que le script puisse au moins commencer à assembler. S'il s'agit de fichiers
 téléchargés, veillez donc à récupérer ces deux fichiers en priorité.
EOF
}

v_echo()
{
  if [ $OPTION_v ]; then echo -e "*** $1"; fi
}

#______________________________
# Function that scan parameters
# It works with style: -a -v
# but also BSD style : -av

scan_parameters()
{
  for param in "$@"
  do
    case "$param" in
      -* )
           if [ "$param" == "-" ]; then
             usage "$MSG_BAD_OPTION"
             exit $E_BAD_OPTION
           fi
           i=1
           while [ $i -lt ${#param} ]
           do
             case ${param:$i:1} in
               h )
                  usage
                  exit 0
                  ;;
               m )
                  OPTION_m='1'
                  ;;
               n )
                  OPTION_n='1'
                  ;;
               f )
                  OPTION_f='1'
                  ;;
               t )
                  if [ ${param:$i:2} = 'tt' ]; then
                    OPTION_t='2'
                    i=$(( $i + 1 ))
                  else
                    OPTION_t='1'
                  fi
                  ;;
               v )
                  OPTION_v='1'
                  ;;
               V )
                  if [ -n "$MSG_BUSY_VERSION" ]; then
                    echo "$MSG_BUSY_VERSION"
                  fi
                  echo "$MSG_VERSION"
                  exit 0
                  ;;
               * )
                  usage "$MSG_UNKNOWN_OPTION -${param:$i:1}" 
                  exit $E_UNKNOWN_OPTION
                  ;;
             esac
             i=$(( $i + 1 ))
           done
           ;;
      *)
         if [ -z "$DISPLAY_SOURCE_FILE_NAME" ]; then
           DISPLAY_SOURCE_FILE_NAME="$param"
         elif [ -z "$DISPLAY_DEST_FILE_NAME" ]; then
           DISPLAY_DEST_FILE_NAME="$param"
         else
           usage "$MSG_TOO_MANY_PARAMS $param"
           exit $E_TOO_MANY_PARAMS
         fi
         ;;
    esac
  done

  if [ -z "$DISPLAY_SOURCE_FILE_NAME" ]; then
    usage "$MSG_UNSPECIFIED_SOURCE_FILE"
    exit $E_UNSPECIFIED_SOURCE_FILE
  else
    SOURCE_FILE_NAME=$( readlink -f "$DISPLAY_SOURCE_FILE_NAME" )
  fi
}

#_________________________________
# Functions that check parameters
# and give some warnings or errors
# if things are not correct


check_parameters()
{
if [ $OPTION_m ]; then
  if [ $OPTION_n ]; then
    echo -e "$MSG_ERROR$MSG_OPTION_M_AND_N"
    exit $E_MSG_OPTION_M_AND_N
  fi
  if [ $OPTION_f ]; then
    v_echo "$MSG_IGNORING_OPTION_F"
  fi
  if [ -n "$DISPLAY_DEST_FILE_NAME" ]; then
    v_echo "$MSG_IGNORING_DEST"
  fi
fi
}

success()
{
  if [ ! $OPTION_m ]; then
    #  If we mv directly it appears that system syncs, and so the script appears to run longer
    #+ When we rm the file first, the async write continues after the script ends.
    rm "$DEST_FILE_NAME"
    mv "$DEST_FILE_NAME_PART" "$DEST_FILE_NAME"
  fi
  echo -e "$MSG_SUCCESS"
  timing 1
  exit 0
}

tip()
{
  echo -e "$MSG_TIP"
  exit $1
}

nop()
{
  cat - >/dev/null
}

md5check()
{
  md5sum | cut -b 1-32 | grep -iq "$( echo ${1} )"
}

timing()
{
  if [ $OPTION_t -ge $1 ]; then date +%T.%N; fi
}


#==========================================================
# START OF THE MAIN PROGRAM HERE !
# /TODO 
# -> Traiter les interruptions (Ctrl-C) et erreurs par un truncate (au lieu de supprimer)

#_________________________________________
# Variables declaration and initialisation

declare -i i size SOURCE_FILE_NB DEST_FILE_NAME_LENGTH SPACE_AVAIL DISK_SPACE_NEEDED DEST_FILE_SIZE CHUNK_SIZE CHUNKS_AVAIL fMD5 LAST_SOURCE_FILE_SIZE 
OPTION_m=''
OPTION_n=''
OPTION_f=''
OPTION_v=''
declare -i OPTION_t=0
DISPLAY_SOURCE_FILE_NAME=''
DISPLAY_DEST_FILE_NAME=''
declare -i CHUNKS_AVAIL=0


set -o pipefail

scan_parameters "$@"

timing 1

if [ ! $OPTION_v ]; then
  echo -n "$MSG_CHECKING"
fi

check_parameters

#==========================================================
# Checking file existence
# - On commence par vérifier le 001 qui contient le header

v_echo "$MSG_CHECKING_FIRST_SOURCE_FILE"


declare -i fEXE EXE_OFFSET

if echo "$SOURCE_FILE_NAME" | grep -q '.exe$'; then
  fEXE=1
  EXE_OFFSET=305664
  FIRST_SUFFIX='exe'
else
  fEXE=0
  EXE_OFFSET=0
  FIRST_SUFFIX='xtm'
fi

RADIX=$( echo "$SOURCE_FILE_NAME" | sed "s/...\.${FIRST_SUFFIX}\$//" )
DISPLAY_RADIX=$( echo "$DISPLAY_SOURCE_FILE_NAME" | sed "s/...\.${FIRST_SUFFIX}\$//" )

FIRST_SOURCE_FILE_NAME="${RADIX}001.${FIRST_SUFFIX}"

if [ ! -f "$FIRST_SOURCE_FILE_NAME" ] || [ ! -s "$FIRST_SOURCE_FILE_NAME" ]; then
  echo -e "${MSG_ERROR}${DISPLAY_RADIX}001.${FIRST_SUFFIX}${MSG_FIRST_FILE_ERROR}"
  tip $E_FIRST_FILE_ERROR
else
  v_echo "$MSG_FIRST_FILE_FOUND ${DISPLAY_RADIX}001.${FIRST_SUFFIX}"
fi

fMD5=$( od -An -vtu1 -j$(( ${EXE_OFFSET} + 91 )) -N1 "$FIRST_SOURCE_FILE_NAME" )

#==========================================================
# Checking if MD5 is included in that xtm
# If not and only a MD5 check is asked (option -m) exit with message

if [ $fMD5 -eq 0 ] && [ $OPTION_m ]; then
    echo -e "$MSG_OPTION_M_AND_NO_MD5"
    exit 0
fi

CHUNK_SIZE=$(( $( stat -c%s "$FIRST_SOURCE_FILE_NAME" ) - 104 - ${fEXE} * 305688 ))

SOURCE_FILE_NB=$( od -An -vtu4 -j$(( ${EXE_OFFSET} + 92 )) -N4 "$FIRST_SOURCE_FILE_NAME" )
DEST_FILE_SIZE=$( od -An -vtu8 -j$(( ${EXE_OFFSET} + 96 )) -N8 "$FIRST_SOURCE_FILE_NAME" )

#---------------------------------
# - On vérifie le dernier fichier
# => Dans le cas de MD5, celui-ci contient les MD5
# => Dans le cas non-MD5, cela sert à vérifier au moins la cohérence de taille des fichiers

v_echo "$MSG_CHECKING_LAST_SOURCE_FILE"

LAST_SOURCE_FILE_NAME=$( printf "${RADIX}%3.3u.xtm" $SOURCE_FILE_NB )
if [ ! -f "$LAST_SOURCE_FILE_NAME" ] || [ ! -s "$LAST_SOURCE_FILE_NAME" ]; then
  printf "$MSG_ERROR$MSG_LAST_FILE_ERROR" "$DISPLAY_RADIX" $SOURCE_FILE_NB
  tip $E_LAST_FILE_ERROR
else
  v_echo "$( printf "$MSG_LAST_FILE_FOUND" "$DISPLAY_RADIX" $SOURCE_FILE_NB )"
fi

LAST_SOURCE_FILE_SIZE=$(( $( stat -c%s "$LAST_SOURCE_FILE_NAME" ) - $fMD5 * $SOURCE_FILE_NB * 32 ))

if [ $(( $CHUNK_SIZE * ($SOURCE_FILE_NB - 1) + $LAST_SOURCE_FILE_SIZE )) -eq $DEST_FILE_SIZE ]; then
  v_echo "$MSG_FILE_SIZES_OK"
else
  echo -e "$MSG_ERROR$MSG_FILE_SIZES_ERROR"
  tip $E_FILE_SIZES_ERROR
fi


#==========================================================
# From here we have first and last file, we can do something!
# Checking output file
# - Vérifie qu'on ne va pas écraser un fichier (si option -f, juste message verbeux)
# - Vérifie qu'on peut bien écrire le fichier (autorisation, nom/chemin correct)
# - Vérifie qu'on a la place d'écrire le fichier
#
# Mais on commence par déterminer le nom du fichier résultat
# Ca dépend de plusieurs choses :
# - si un fichier destination a été spécifié en paramètre
#   + et si c'est le cas, si c'est un répertoire existant ou pas

if [ $OPTION_m ]; then
  v_echo "$MSG_NO_FILE_WRITTEN"
else

  v_echo "$MSG_COMPUTING_DEST"

  if [ -z "$DISPLAY_DEST_FILE_NAME" ] || [ -d "$DISPLAY_DEST_FILE_NAME" ]; then
    DEST_FILE_NAME_LENGTH=$( od -An -vtu1 -j$(( ${EXE_OFFSET} + 40 )) -N1 "$FIRST_SOURCE_FILE_NAME" )
    DEFAULT_DEST_FILE_NAME=$( dd if="$FIRST_SOURCE_FILE_NAME" bs=1 skip=$(( ${EXE_OFFSET} + 41 )) count=$DEST_FILE_NAME_LENGTH 2>/dev/null)

    if [ -z "$DISPLAY_DEST_FILE_NAME" ]; then
      this_file_radix=${DISPLAY_SOURCE_FILE_NAME%"${DISPLAY_SOURCE_FILE_NAME##*/}"}
    else                        # Ici DISPLAY_DEST_FILE_NAME est forcément un répertoire
                                #     on rajoute le / final si nécessaire
      if [ ${DISPLAY_DEST_FILE_NAME:(-1)} == '/' ]; then
        this_file_radix="$DISPLAY_DEST_FILE_NAME"
      else
        this_file_radix="$DISPLAY_DEST_FILE_NAME/"
      fi
    fi
    DISPLAY_DEST_FILE_NAME="$this_file_radix$DEFAULT_DEST_FILE_NAME"
  fi

  v_echo "$MSG_DISPLAY_DEST $DISPLAY_DEST_FILE_NAME"
  DEST_FILE_NAME=$( readlink -fn "$DISPLAY_DEST_FILE_NAME" )
  DEST_FILE_NAME_PART="${DEST_FILE_NAME}.part"

#---------------------------------
# Vérifications de la possibilité d'écrire le fichier résultat

  v_echo "$MSG_CHECK_DEST_WRITABLE"

  if [ -f "$DEST_FILE_NAME" ] && [ -s "$DEST_FILE_NAME" ]; then
    if [ $OPTION_f ]; then
      v_echo "$MSG_ATTENTION$MSG_WARN_FORCED_OVERWRITE"
    else
      size=$( stat -c%s "$DEST_FILE_NAME" )
      if [ $size -eq $DEST_FILE_SIZE ]; then
        printf "$MSG_ATTENTION$MSG_WARN_OVERWRITE" $DISPLAY_DEST_FILE_NAME
        echo "$MSG_FILE_SIZE_MATCHES"
      else
        printf "$MSG_ERROR$MSG_WARN_OVERWRITE" $DISPLAY_DEST_FILE_NAME
        echo "$MSG_FILE_SIZE_DOES_NOT_MATCH"
      fi
      echo -e "$MSG_OVERWRITE_HINT"
      exit $E_WARN_OVERWRITE
    fi
  fi

  touch "$DEST_FILE_NAME" "$DEST_FILE_NAME_PART" 2>/dev/null

  if [ $? -ne 0 ]; then
    printf "$MSG_ERROR$MSG_WRITE_ERROR" $DISPLAY_DEST_FILE_NAME
    exit $E_WRITE_ERROR
  fi

  TMP=$( df "$DEST_FILE_NAME" | sed -n '2p' )
  SPACE_AVAIL=$(( $( echo $TMP | cut -d' ' -f 4 ) * 1024 - 1024))
  size=$( stat -c%s "$DEST_FILE_NAME_PART" )
  DISK_SPACE_NEEDED=$(( $DEST_FILE_SIZE - $size ))
  if [ $DISK_SPACE_NEEDED == 0 ]; then
    success
  fi

  if [ $SPACE_AVAIL -lt $DISK_SPACE_NEEDED ]; then
    printf "$MSG_ERROR$MSG_INSUFFICIENT_SPACE" $( echo $TMP | cut -d' ' -f 6 ) "$DISPLAY_DEST_FILE_NAME" $DISK_SPACE_NEEDED $SPACE_AVAIL
    exit $E_INSUFFICIENT_SPACE
  fi

  CHUNKS_AVAIL=$(( $size / $CHUNK_SIZE ))

  if [ $(( $size % $CHUNK_SIZE )) -eq 0 ]; then
    v_echo "$CHUNKS_AVAIL $MSG_CHUNKS_AVAIL"
  else
    if [ $OPTION_f ]; then
      v_echo "$MSG_INFO_DELETED_OLD_FILE"
      rm "$DEST_FILE_NAME_PART" 2>/dev/null
      CHUNKS_AVAIL=0
    else
      printf "$MSG_ERROR$MSG_INCOHERENT_PARTIAL_FILE" $DISPLAY_DEST_FILE_NAME
      exit $E_INCOHERENT_PARTIAL_FILE
    fi
  fi

  v_echo "$MSG_ALL_CHECKED_OK"
fi


#==========================================================
#  The Real work starts here!
# - Toutes les vérifications et préparations étant finies on commence
#   la concaténation/checksum à proprement parler

if [ $OPTION_m ]; then
 DEST_FILE_NAME_PART="/dev/null"
fi
if [ $fMD5 -eq 0 ] || [ $OPTION_n ]; then
  MD5_PROG="nop"
else
  MD5_PROG="md5check"
fi
  
if [ ! $OPTION_v ]; then
  echo -e "$MSG_OK"
fi
timing 1

if [ $CHUNKS_AVAIL -eq 0 ]; then
  printf "$MSG_PROCESSING_START" $SOURCE_FILE_NB
else
  printf "$MSG_PROCESSING_RESTART" $(( $CHUNKS_AVAIL + 1 )) $(( $SOURCE_FILE_NB - $CHUNKS_AVAIL ))
fi
echo "$MSG_SEPARATOR"

i=$CHUNKS_AVAIL
while (( $i < $SOURCE_FILE_NB )) ; do
  if [ $fMD5 -eq 1 ]; then
    this_file_MD5=$( dd if="$LAST_SOURCE_FILE_NAME" bs=1 skip=$(( $LAST_SOURCE_FILE_SIZE + $i * 32)) count=32 2>/dev/null )
  fi
  i=$(( $i + 1 ))
  this_file_radix=$( printf "%s%3.3u" "$RADIX" $i )

  if [ ${i} -eq 1 ]; then
    printf "$MSG_PROCESSING_FILE" "$DISPLAY_RADIX" $i ${FIRST_SUFFIX}
  else
    printf "$MSG_PROCESSING_FILE" "$DISPLAY_RADIX" $i 'xtm'
  fi

  case $i in
    1 ) 
        if [ ${fEXE} -eq 0 ]; then
          # Pour le premier fichier on ne 'tee' pas les 104 premiers octets, mais ils rentrent dans le md5
          { dd if="$this_file_radix.xtm" bs=104 count=1 2>/dev/null &&
              # On fait un deuxième dd pour "aligner" à un bloc de 4096, et ensuite par 4096
              # C'est 7% plus rapide que de ne faire que des dd par 104.
              # Si le fichier est plus petit que 4096 (peu probable) ça fonctionne tout de même
              # car dans ce cas le deuxième s'arrête à la fin du fichier et le dernier dd
              # ne retourne rien.
              { dd if="$this_file_radix.xtm" bs=8 skip=13 count=499 2>/dev/null
                dd if="$this_file_radix.xtm" bs=4096 skip=1 2>/dev/null 
              } | tee "$DEST_FILE_NAME_PART";
          } | $MD5_PROG "${this_file_MD5}"
        else
          FIRST_FILE_BLOCKS=$(( ( ${CHUNK_SIZE} - 1432 ) / 4096 ))
          FIRST_FILE_PAD=$(( ${CHUNK_SIZE} - 1432 - ${FIRST_FILE_BLOCKS} * 4096 ))
          { dd if="$this_file_radix.exe" bs=8 skip=38208 count=13 2>/dev/null &&
              # Idem que ci-dessus pour les optimisations avec des PGCD recalculés
              # C'est juste un peu plus compliqué car on doit aussi sauter 24
              # octets à la fin, donc il faut savoir combien de blocs de 4096 on a.
              { dd if="$this_file_radix.exe" bs=8 skip=38221 count=179 2>/dev/null
                dd if="$this_file_radix.exe" bs=4096 skip=75 count=${FIRST_FILE_BLOCKS} 2>/dev/null 
                dd if="$this_file_radix.exe" bs=1 skip=$(( (${FIRST_FILE_BLOCKS} + 75) * 4096 )) count=${FIRST_FILE_PAD} 2>/dev/null 
              } | tee "$DEST_FILE_NAME_PART";
          } | $MD5_PROG "${this_file_MD5}"
        fi
      ;;

    $SOURCE_FILE_NB )
        # Pour le dernier fichier on enlève les octets de MD5 (ou pas... s'il n'y en a pas !)
        dd if="$this_file_radix.xtm" bs=$LAST_SOURCE_FILE_SIZE count=1 2>/dev/null | \
          tee -a "$DEST_FILE_NAME_PART" | \
            $MD5_PROG "${this_file_MD5}"
      ;;

    *)
        # On vérifie la cohérence de taille du fichier seulement si ce n'est ni le premier
        # ni le dernier, car pour c'est deux fichiers, c'est déjà vérifié avant !
       size=$( stat -c%s "$this_file_radix.xtm" 2>/dev/null ) 
       if [ $? -ne 0 ] || [ $size -ne $CHUNK_SIZE ]; then
         echo -e "$MSG_ATTENTION"
         echo "$MSG_FILE_MISSING"
         if [ $OPTION_m ]; then
           continue
         else
           echo "$MSG_FILE_MISSING_TIP"
           exit $E_WARN_FILE_MISSING
         fi
       fi

       tee -a "$DEST_FILE_NAME_PART" <"$this_file_radix.xtm" | $MD5_PROG "${this_file_MD5}"
  esac
  if [ $? -eq 0 ]; then         # No error: all is OK
    echo -e "$MSG_OK"
  else                          # Error: it means we get an incorrect MD5, a write error, or other bad things, so here we cancel and abort
    echo -e "$MSG_ERROR"
    if [ ! $OPTION_m ]; then    # But we stop only if no option -m.
                                # If option -m we continue so that we check ALL the files and not stop on the first error
      rm "$DEST_FILE_NAME_PART" "$DEST_FILE_NAME" 2>/dev/null
      exit $E_CRITICAL_ERROR
    fi
  fi
  timing 2
done 

#==========================================================
# Success!

success

Mode d'emploi :
Installation :
- coller ce source dans un fichier de votre choix (par exemple : /usr/local/bin/tuXtremMerge).
- rendez le exécutable

Usage :

- lancez dans un terminal

Désinstallation :
- supprimez le script

Dernière modification par Zakhar (Le 21/01/2012, à 11:13)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#2 Le 19/07/2010, à 11:30

Zakhar

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

Afin de ne pas trop surcharger le post principal, et parce que cela ne concerne que les utilisateurs de NAS, les instructions spécifiques sont désormais sur ce post.


Fonctionnement sur votre NAS (Synology, DLink, ...) ... sans perdre de temps en transferts réseau

Matériels testés :

  • Synology DS211J
    Contributeur : Moonface.
    Voir témoignage -et correction- en post 29 et 31.

  • Synology DS1010+
    Contributeur : stadros83.
    Voir témoignage -et corrections- en post 36 à 117... et merci pour son infinie patience (3 pages de debug !..)

  • Synology DS411+
    Contributeur : zootroopa.
    Voir témoignage -et corrections- en post 132 à 170... et merci pour sa patience

  • Synology DS209
    Contributeur : Gajo22.
    Voir témoignage aux post 182 à 184, page 8

  • Synology DS211+
    Contributeur : NiKo88.
    Voir témoignage aux post 186, page 8

  • Synology DS211
    Contributeur : Josh63.
    Voir témoignage aux post 231, page 10

  • DLink DNS 325
    Contributeur : McMyst.
    Voir témoignage aux post 240, page 10

  • Synology DS112
    Contributeur : olvrrp.
    Voir témoignage au post 258, page 11


Mode d'emploi :

Sur certains NAS, le script principal fonctionnera directement (Synology DS211J, témoignage Moonface).
Dans ce cas, vous n'avez besoin de rien de plus, une fois le script principal (voir post #1) copié sur votre NAS, simplement :

  1. Ouvrez donc une session ssh ou telnet vers votre NAS

  2. Lancez le script comme indiqué dans le post précédent (#1)


Ça ne fonctionne pas sur mon NAS... :
Sur certains NAS (Synology DS1010+, voir page 2, témoignage de stadros83, ou page 10 témoignage McMyst sus DLink DNS 325), le système n'est pas un GNU/linux mais Busybox.
Busybox est un noyau Linux + des utilitaires GNU simplifiés, le tout dans une taille mémoire toute petite. Cette taille mémoire réduite fait que certaines commandes sont "simplifiées", certaines fonctions sont inexistantes ou se comportent différemment.

L'idéal est donc, si vous le trouvez pour votre NAS, d'installer le package coreutils qui contient l'ensemble des utilitaires GNU usuels. (Voir un peu plus bas pour l'installation de ce package sur Synology). En principe, avec ce package correctement installé, tout devrait rentrer dans l'ordre.

Sinon depuis la 1.6.0, le fonctionnement du script a été adapté pour fonctionner aussi avec ces Busybox (>1.10.3), mais nécessite un "script compagnon" qui permet de contourner et remplacer les fonctions inexistantes ou se comportant autrement que sur GNU.

Pour ces NAS, il vous faut le "script compagnon" ci-dessous dans le même répertoire que tuXtremMerge.

Clic-droit et  copier la cible du lien

ou

Copier/coller le script ci-dessous

#! /bin/bash
# Copyright (C) 2010-2011 Zakhar for ubuntu-fr

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.

# The text of the GNU General Public License is available at
# http://www.gnu.org/licenses/gpl-2.0.html; if you cannot access it,
# write to the Free Software Foundation, Inc., 51 Franklin Street,
# Fifth Floor, Boston, MA 02110-1301 USA.
#===========================================================

# Fonction :
# ----------
#  - Ce script fonctionne avec tuXtremMerge
#  - Il vise à remplacer les fonctions qui n'existent pas sur
#    Busybox 1.16.1 utilisé sur les Synology DS1010+
#  - Ce script fonctionne également sur Ubuntu (Lucid)... puisque
#    c'est ainsi que je le teste !.. Mais il alourdirait inutilement
#    les traitements puisque certaines commandes existantes sont réécrites
#    en shell, donc plus lent, sujet à des bugs, etc...
#    Par conséquent ça a été séparé expressément.
#
# Usage :
# -------
#  busyXtremMerge Nom_Du_Fichier_NNN.xtm
#   (N'importe lequel des fichiers fonctionne : 001 ou autre)
#
# Tested : Testé sur Synology DS1010+, DS411+
# ------
#
# Version : Syno + version du script tuXtremMerge utilisé
# -------
#
# Date : 2011-09-24
# -----
#
# Author : Zakhar (ubuntu-fr)
# ------
#
# Contributor :  // Ajouter votre nom si vous contribuez et redistribuez //
# -----------
#  stadros83 @ ubuntu.fr : début des tests Synology DS1010+
#    - problèmes readlink sur Synology 1010+ (pas d'option -f)
#            => retrait de readlink et remplacement par une fonction shell 
#    - problème od (commande inexistante)
#            => Installation par une commande Syno : ipkg install textutils
#    - problème du -B (option inexistante)
#            => Supression de "du". En réalité pour homogénéiser, on utilise
#               stat -c%s partout
#    - problème stat -c (option inexistante)
#            => Remplacé par un ls avec découpage du résultat
#    - problème pas de support du "process substitution"
#            => le md5sum qui se servait de cela est donc remplacé par un
#               md5sum "pipé" avec un grep
#    - problème pas de ibs/obs sur la commande dd
#            => Nouveaux algorithmes avec uniquement des bs dans le programme
#               commun... et en plus c'est (un peu) plus rapide !
#  zootroopa @ ubuntu.fr : début des tests Synology DS411+
#    - problème sur la commande od qui ne travaille pas en 64bits. Du coup tout
#               fichier supérieur à 4Go posait problème.
#            => Contournement par 2 od sur 32bits (confirmé stadros83)
#    - problème non lié à busyXtremMerge, tee "de base" est buggé. La version
#               dans coreutils marche très bien et semble apporter des textutils
#               à niveau... à vérifier !
#
# History :
# ---------
#  1.1.0
#  - Adaptations pour support des .exe et tuXtremMerge version 1.7.0
#  1.0.3
#  - Vérification qu'on a au moins une version suffisante de tuXtremMerge, en
#    l'occurrence pour cette 1.0.3 il faut la 1.6.2 au moins
#  - Suite à simplification dans le md5sum du programme commun (suppression du
#    "process substitution") on n'a plus besoin du contournement md5sum
#  1.0.2
#  - Contournement pour od en 64bits
#  1.0.1
#  - au lieu de passer par une variable, on utilise "command" pour invoquer
#    le md5sum qui a été "masqué" par la fonction du même nom.
#  1.0.0
#  - Nouveaux algorithmes (main script) pour les dd sans ibs/obs
#  - Contournement pour l'inexistence du "process substitution"
#  - Remplacement du stat -c%s par une fonction (ls + tr + cut)
#  - Suppression du (homogénéisation)
#  0.9.0
#  - readlink ne se comporte pas pareil sur Synology 1010+
#  - Retrait de readlink, remplacé par la fonction shell readlnk

#==========================================================
#  Messages and Error codes.
#+ This way it is easyier, if somebody would like to localise
readonly MSG_BUSY_VERSION="busyXtremMerge (turbo XTM), contournements pour Busybox, version 1.1.0"

#==========================================================
# Fonctions de remplacement des commandes déficientes !

# Remplace readlink qui n'a pas le même comportement partout
# Par ex. sur Synology 1010+ tournant sous Busybox 1.16.1, l'option -f n'existe pas
# Retourne l'emplacement absolu du fichier en le déréférençant éventuellement
# Readlink est toujours utilisé dans le script principal sous cette forme :
# readlink -f Nom_Fichier
# On ne tient donc compte que tu deuxième argument

readlink()
{
  if [ -h "$2" ]; then  # C'est un lien symbolique !
    temp=$( ls -l "$2" )
    target=${temp#* -> }
    if [ -h "$target" ]; then  # Recursif...
      pushd $(dirname "$target") >/dev/null
      target=$(readlnk "$target")
      popd >/dev/null
    fi
  else
    target="$2"
  fi
  # Ici la variable "target" vaut soit $2 soit le déréférencement
  temp=$(cd $(dirname "$target"); pwd)
  if [ "$temp" != '/' ]; then # On rajoute / au dirname, sauf pour root
    temp="${temp}/"
  fi
  echo -n "${temp}${target##*/}"
}


# Remplace stat qui n'a pas le même comportement sur les anciens Busybox
# Par ex. sur Synology 1010+ tournant sous Busybox 1.16.1, l'option -c n'existe pas
# C'est moche, mais on remplace donc par un ls + cut
# On utilise le 2ème paramètre car c'est toujours utilisé stat -c%s fichier

stat()
{
  ls -l "$2" | tr -s [:blank:] | cut -d' ' -f 5
}


# md5sum fonctionne correctement... mais pas le "process substitution"
# Or on l'utilise dans la version standard pour éviter d'avoir utiliser 
# des fichiers temporaires. Ici, on remplace ça par un md5sum 
# "classique" suivi d'un grep sur la signature à trouver.

# Supprimé en 1.0.3 car c'est reporté ainsi dans le "commun"
#md5sum()
#{
#  command md5sum | grep -iq "$( echo $this_file_MD5 )"
#}


# Test pour voir si ça va plus vite ainsi pour le dernier fichier
#dd()
#{
#  if [ ${2:3} -le 4096 ]; then
#    command dd "$@"
#  else
#    blocks=$(( ${2:3} / 4096 ))
#    last=$(( ${2:3} % 4096 ))
#    command dd "${1}" bs=4096 count=${blocks} &&\
#    command dd "${1}" bs=1    count=${last} skip=$(( ${2:3} - ${last} ))
#  fi
#}


# Contournement du od qui ne travaille pas sur 64bits et donc problème
# pour les fichiers de plus de 4G
od()
{
  if [ ${2} = '-vtu8' ]; then
    low=$(  command od -An -vtu4 -j$(( ${EXE_OFFSET} + 96 ))  -N4 "$FIRST_SOURCE_FILE_NAME" )
    high=$( command od -An -vtu4 -j$(( ${EXE_OFFSET} + 100 )) -N4 "$FIRST_SOURCE_FILE_NAME" )
    echo $(( high * 4294967296 + low ))
  else
    command od "$@"
  fi
}

#==========================================================
# Et on source le script standard
# S'il n'est pas mis dans le même chemin, il faut donc changer la commande

THIS_SCRIPT_DIR=$( dirname $0 )

if [ -f "${THIS_SCRIPT_DIR}/tuXtremMerge" ]; then
  main_version=$( grep 'readonly MSG_VERSION=' "${THIS_SCRIPT_DIR}/tuXtremMerge" | sed 's/.*version //;s/"//' )
  if [[ "${main_version}" < '1.7.0' ]]; then
    echo "La version ${main_version} de 'tuXtremMerge' est insuffisante, il vous faut au moins la version 1.7.0"
  else
    . "${THIS_SCRIPT_DIR}/tuXtremMerge"
  fi
else
  echo -e "Script 'tuXtremMerge' non trouvé, il doit être dans le même répertoire que ce présent script."
fi

Le script s'utilise avec les même options que le script principal, pensez juste à lancer busyXtremMerge au lieu de lancer tuXtremMerge.
Bien sûr, une fois téléchargé, pensez à le rendre exécutable sur votre NAS avec un :

chmod +x busyXtremMerge

IMPORTANT : Busybox cherchant à obtenir une taille la plus réduite possible, certaines commandes indispensables au bon fonctionnement du script ne sont pas présentes d'usine, c'est le cas notamment de la commande od qui nous permet de lire les entêtes binaires du premier fichier.

Pour vérifier si vous avez la commande installée, vous pouvez faire :

which od

Un résultat vide prouvera qu'elle n'existe pas.

Pour installer cette commande, sur Synology DS1010+

  1. Installer ipkg (voir forum Synology) pour avoir accès aux extension.

  2. Installer le paquet coreutils (qui contient entre autres l'utilitaire od)

    ipkg install coreutils

(Nota : en réalité od est à la base dans textutils, mais coreutils contient aussi textutils, et il semble qu'ils soient beaucoup beaucoup plus à jour, même en avance par rapport à Lucid !)

Vous pouvez ensuite tester à nouveau si cette fois, od est bien installé.

Le Busybox de Synology n'utilise pas bash par défaut mais ash. bash n'est même pas installé !
Vous avez deux options pour faire fonctionner le script :
-Option 1) installer bash.

ipkg install bash

Mais comme il n'est pas installé comme tout système Linux dans /bin, et que c'est /bin que le script le recherche, le plus propre est alors de rajouter aussi un lien symbolique de la sorte :

ln -s /opt/bin/bash /bin/bash

Ainsi, le script trouvera bash, et il est possible que vous n'ayez même plus besoin de busyXtremMerge dans ces conditions.

-Option 2) ne pas installer bash.
Dans ce cas, il faut simplement retirer la première ligne de busyXtremMerge qui réclame bash (ou la remplacer par #! /bin/sh qui réclamera alors le shell par défaut du système, soit ash dans ce cas).
Le script utilisera ash, et ça fonctionne.


ATTENTION ! sur Synology DS1010+, ne tentez pas d'installer Busybox lui-même avec ipkg, en effet, la version disponible dans les "extension" est bizarrement une version antérieure à celle présente d'usine sur votre matériel... sans moyen simple de revenir à la configuration d'usine.
Fort heureusement, cela ne semble pas avoir d'effet négatif visible... mais la manipulation est tout de même déconseillée puisqu'on régresse sur une version antérieure.


Ça ne fonctionne toujours pas sur mon NAS... :

N'hésitez pas à faire comme Moonface, et stadros83, même si vous n'avez pas plus de compétence Linux que de taper une ligne de commande sur votre NAS.
Un post ici en expliquant ce qui ne va pas, avec la marque et le modèle de votre NAS, si possible sur quel O.S. ça tourne, et ce que ça vous donne comme message d'erreur (voir les posts de debug de stadros83 pour les options debug de bash).



N'hésitez pas à témoigner !

Ca fonctionne sur votre NAS !.. N'hésitez pas à témoigner, même pour dire simplement que ça fonctionne sur votre NAS (et indiquer le modèle), ça aidera ceux qui cherchent une solution pour un NAS identique au vôtre.
N'oubliez pas qu'on est ici dans le monde du Libre... vous avez bien sûr la liberté de ne rien dire du tout, mais c'est sympa pour mon travail, et pour les autres utilisateurs, de savoir que ça fonctionne, directement, ou avec telle ou telle manipulation supplémentaire, sur un modèle donné de NAS.
Ainsi, votre témoignage sera votre pierre à l'édifice, et fera progresser la connaissance et le partage d'information.

Bien sûr, si ça ne fonctionne pas et que vous savez debugger/améliorer un script, vous pouvez même contribuer directement avec du code !..
Toute contribution, que ce soit du code ou un simple témoignage, est la bienvenue.

Merci.

Dernière modification par Zakhar (Le 07/06/2015, à 16:31)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#3 Le 19/07/2010, à 23:14

Zakhar

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

Changelog :

0.9.0 => 1.0.0

- Supporte d'être lancé avec des noms de fichiers contenant des chemins
- Deuxième paramètre optionnel pour spécifier le fichier destination
- Support des noms de fichiers contenant des espaces (source et destination)
- Vérification au préalable de l'existence du fichier destination pour éviter les écrasement intempestifs
- Vérification avant de calculer les MD5 qu'on va bien pouvoir écrire sur le fichier destination (mieux que XtremSplit qui le fait après avoir calculé les MD5 !)

1.0.0 => 1.0.1
- Bug : lorsque le script était placé dans /usr/local/bin (par exemple) et donc lancé grâce à sa présence dans le PATH, les fichiers passé en relatif ne fonctionnaient pas. Le bug est corrigé, vous pouvez donc désormais placer le script dans votre PATH et le lancer depuis n'importe quel répertoire contenant des xtm
- Amélioration : vérifie l'espace disponible sur la partition cible avant de commencer (plutôt que de passer du temps à faire les MD5 et se planter au milieu de la copie !).
- Amélioration : l'affichage des fichiers traités (et/ou des erreurs) se fait avec les noms de fichiers passés en paramètre, y compris leurs éventuels chemins (auparavant seul le "basename" était affiché). Exemple, si on lance :

tuXtremMerge Téléchargements/truc001.xtm

On aura bien un affichage

Vérification de Téléchargement/truc001.xtm

(précédemment, le "morceau" en gras n'était pas affiché).

Dernière modification par Zakhar (Le 21/05/2011, à 16:28)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#4 Le 24/07/2010, à 12:13

Ypnose

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

Je viens de tester ton script pour recoller un film en HD de 7 Go et je dois dire que je suis particulièrement enchanté du résultat. Le tout s'est passé extrêmement rapidement. Je voulais te féliciter. Bravo!

Par contre, petite suggestion: au lieu de placer le fichier recollé dans /home/nom_d'utilisateur , il serait plus pratique je pense de le mettre dans le dossier où se trouve toutes les parties .xtm .
Merci.

#5 Le 24/07/2010, à 19:22

Zakhar

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

Merci ;-)

Comment as-tu procédé pour lancer le script ?

Si tu lances les script depuis ton home, avec en seul paramètre le nom du fichier xtm, il mettra effectivement le résultat dans ton home.

Tu as deux solutions pour obtenir un autre résultat :

cd /chemin/des/fichiers/xtm
tuXtremMerge le_fichier.001.xtm

Ce qui n'est guère plus long que ce que tu as fait (je présume), car dans tous les cas il te faut taper le chemin de tes fichiers xtm une seule fois, que ce soit après un cd, ou dans la commande de fusion.... mais cela présume que tu aurais mis le script dans un des répertoires du PATH wink Si tu l'as mis dans ton home, il suffit juste alors de lancer avec ~/tuXtremMerge après le cd.

Ou utiliser le deuxième paramètre du script prévu à cet effet :

tuXtremMerge /chemin/des/fichiers/xtm/le_fichier.001.xtm /chemin/du/resultat/resultat.mkv

Mais je prends ta suggestion. Le comportement par défaut demeurera (il est logique pour un script !) mais je rajouterai une option pour forcer le résultat au même endroit que le xtm, quelque soit le répertoire de lancement du script.

Donc ça donnera pour ton cas

tuXtremMerge -s /chemin/fichier.001.xtm

Et là il mettra le résultat dans /chemin/ à côté du fichier.001.xtm

Par contre si tu l'as lancé via Nautilus... eh bien c'est tout simplement pas encore prévu wink

En réalité ça marche fort bien, mais comme c'est un script et que Nautilus les lance via une console invisible, tu ne vois aucune progression et c'est frustrant. Dans ce cas, le chemin par défaut est bien le home, et le fichier résultat est effectivement copié dans le home. Donc en cas de lancement via Nautilus, le comportement que tu indiques sera celui par défaut, parce que c'est probablement ce qu'on veut faire si on associe les xtm au script.

Je ferait prochainement une version adaptée pour Nautilus. Pour cela il faut que ce soit graphique. Je vais rajouter du Zenity, qui est de base dans Lucid.

Dernière modification par Zakhar (Le 26/07/2010, à 00:59)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#6 Le 26/07/2010, à 01:03

Zakhar

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

Ypnose a écrit :

Je viens de tester ton script pour recoller un film en HD de 7 Go et je dois dire que je suis particulièrement enchanté du résultat. Le tout s'est passé extrêmement rapidement. Je voulais te féliciter. Bravo!

Par contre, petite suggestion: au lieu de placer le fichier recollé dans /home/nom_d'utilisateur , il serait plus pratique je pense de le mettre dans le dossier où se trouve toutes les parties .xtm .
Merci.

Voila, c'est fait.

J'en ai profité pour rajouter aussi d'autres options que j'avais en tête.

Pour ton cas, tu fais donc :

tuXtremMerge -s chemin/fichier.001.xtm

L'option -s a pour effet de forcer le résultat dans le même répertoire que les xtm.
L'aide (ci-dessous) indique bien le comportement par défaut (en l'absence de -s) qui est logique pour un script. wink

tuXtremMerge

ou

tuXtremMerge -h

donne le message d'usage / aide (ci-dessous)


1.0.1 => 1.1.0
- Rajout de l'exploration des arguments
- Rajout des options : voir description dans la fonction usage
- Un peu de couleurs pour égayer l'affichage !

Description de l'usage et des options :

Usage : tuXtremMerge [Options] Source [Destination]

Source : le fichier source, généralement de la forme [chemin/]fichier.001.xtm
         On peut cependant indiquer n'importe lequel des xtm de la série, par
         exemple fichier.007.xtm

Destination : nom du fichier destination souhaité.
         Si la destination est un répertoire existant, le fichier résultat sera
         stocké dans ce répertoire, avec le nom indiqué au découpage en xtm.
         Par défaut, le fichier résultat est stocké dans le répertoire
         courant et porte le nom prévu lors du découpage en xtm.

Options :
 -h  Affiche le présent message d'aide.
 -s  Crée le fichier résultat dans le même répertoire que les fichiers xtm.
 -n  Ne vérifie pas les md5.
 -f  Force l'écriture du fichier résultat.
     Si un fichier existe déjà il est écrasé.
 -v  Verbeux.

Dernière modification par Zakhar (Le 26/07/2010, à 01:06)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#7 Le 26/07/2010, à 02:56

Ypnose

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

Le pied total! Merci smile

#8 Le 26/07/2010, à 09:13

Zakhar

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

:-)

J'ai pas fini les "explorations" en script.

Je réfléchis à 3 pistes :
-1) vu que je teste désormais le fait que le 2ème paramètre soit un répertoire ou pas, je me demande si l'option que tu suggérais n'est pas le comportement par défaut le plus logique. Ca allègerait le script de l'option -s, et pour écrire le résultat dans le répertoire courant on peut toujours faire :

tuXtremMerge fichier.001.xtm .

(Le . en deuxième paramètre désigne le répertoire courant où on veut le résultat)

-2) encore plus vite... Option -o (optimiste) qui mélange les MD5 et la concaténation. L'intérêt, si on suffisamment de mémoire (par exemple 3 ou 4 GB) c'est que Linux va mettre en cache les fichiers lors du MD5, et donc la concaténation se fera de la mémoire vers le disque. On devrait gagner un temps considérable !
Bien sûr, dans le cas où un MD5 est faux... on a perdu du temps pour rien à concaténer... c'est l'avantage et l'inconvénient d'être optimiste.

-3) Pour diminuer l'inconvénient de l'option -o en cas de mauvais MD5, ou tout simplement pour "anticiper", une option -a qui traite les fichiers présents en tenant compte de la taille existante du fichier résultat (d'où le -a comme append ou ajout en français). On peut ainsi concaténer au fur et à mesure du téléchargement. Bien sûr, pour cela il faut charger le premier, puis le dernier fichier (qui contient les MD5), et ensuite les autres.


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#9 Le 26/07/2010, à 15:18

Zakhar

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

La piste 2 fut fructueuse, mais pas dans le sens que j'imaginais.

En réalité, le fait d'intercaler MD5/Concaténation fait gagner assez peu via la cache fichiers Linux. On gagne environ 10%.
Par contre, l'option "optimiser" fait désormais les opérations avec un tee, c'est à dire qu'avec une seule commande, on lit le fichier, on écrit le résultat, et on fait le checksum !

Par rapport au traitement séquentiel, on gagne quasiment tout le temps du MD5 !

Sans optimisation (sur le fichier test de 8Gio) :
- MD5 : 1m31
- Concaténation : 3m02
- Total : 4m33

Optimisation :
- Temps : 3m07


Le script avec cette nouvelle option sera prochainement en ligne (je finis de le débugger).

Dernière modification par Zakhar (Le 26/07/2010, à 15:19)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#10 Le 26/07/2010, à 17:00

Ypnose

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

Beau boulot! Ce script est fabuleux.

#11 Le 26/07/2010, à 18:27

Zakhar

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

Je finis de débugger aussi l'option -a (mode "append").

C'est marrant, on télécharge, et de temps en temps on lance :

tuXtremMerge fichier.001.xtm -a

Et ça produit un résultat partiel avec les fichiers déjà téléchargés.
(Il faut bien sûr commencer avec le premier et le dernier fichier).

Ainsi, lorsqu'on a fini le téléchargement, il n'y a plus que 2 fichiers à recoller (l'avant-dernier et le dernier) et ça se fait en deux coups de cuillère à pot !

Voila, test fait sur un fichier autour de 11,3Gio, test et rajout des deux derniers en 45s. Les premiers -a avaient été faits pendant le DL. smile

Dernière modification par Zakhar (Le 26/07/2010, à 19:30)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#12 Le 26/07/2010, à 23:57

Zakhar

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

1.1.0 => 1.2.0

- Suggestion Hypnose : suppression du -s, le défaut est désormais le même répertoire que les fichiers xtm. Pour avoir le résultat recollé dans le répertoire courant, on spécifie "." (soit le répertoire courant) comme répertoire résultat.
- Mode TURBO !.. L'option -o
- Mode progressif !.. L'option -a
- Diverses corrections de bug

Dernière modification par Zakhar (Le 26/07/2010, à 23:58)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#13 Le 27/07/2010, à 10:20

Zakhar

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

Évolutions :
à partir de la 1.2.0, j'ai mis dans le script à peu près toutes les fonctions qui me semblent nécessaires... il y a même plus de choses que dans l'original !..
Ce script en mode console devrait donc évoluer gentiment avec quelques corrections de bugs et quelques améliorations marginales.

La suite sera le mode graphique.

En réalité le mode graphique n'apporte vraiment pas grand chose puisque essentiellement le script a besoin d'un nom de fichier, et restitue un avancement des opérations.
L'apport principal sera cependant de pouvoir le lancer depuis Nautilus. On peut le faire avec le script actuel, mais sans affichage graphique on n'a aucun retour visuel sur ce que le script est en train de faire et sur l'avancement des opérations.

L'affichage se fera donc au travers de Zenity (présent de base dans Lucid).

Pour ce faire, le script existant doit être totalement remanié, car le mode d'affichage implique un regroupement assez radicalement différent des choses.
Aussi, le script graphique aura bien moins d'options.
En réalité, à l'idéal, il n'aurait aucune option !..

Il va donc devoir automagiquement deviner s'il doit utiliser l'option -o ou l'option -a
Les autres options secondaires : donner un nom au fichier résultat par exemple ne sont pas indispensables en mode graphique, on peut toujours renommer/copier le fichier résultat produit.

Compte tenu de tout cela, le mieux est de faire un "fork". Je partirai donc de la 1.2 et je l'adapterai au mode graphique.
Il y aura donc prochainement 2 scripts :
- celui mode "console", optimisé aux petits oignons et avec des options assez larges permettant une palette d'opérations variées.
- celui en mode "graphique" possédant un maximum d'automatisations au détriment des fonctionnalités et de la performance (je vais quand même essayer de ne pas trop dégrader !), mais étant beaucoup plus "simple" à utiliser pour la plupart des utilisateurs.

A bientôt !

Dernière modification par Zakhar (Le 27/07/2010, à 10:22)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#14 Le 27/09/2010, à 10:46

spinoziste

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

Salut Zakhar . Et merci pour ce travail . Ca à l'air d'en jeter un max . (Tres bonne initiative pour ceux qui ne veulent pas de wine sur leur Linux . big_smile )

J'ai une petite question . Je ne connaissais pas les .xtm jusqu'à il y a peu et je me trouve avec des fichiers .xtm tels ceux ci :

fichier.001.exe fichier.002.xtm fichier.003.xtm etc ...

Comment faire marcher ton script dans ce cas là car la commande

Tuxtremsplit fichier.001.exe
Tuxtremsplit fichier.001.xtm

(avec le fichier rennomé)
renvoi :

fichier.001.exe non trouvé ou vide

Peux tu m'eclairer . Merci @+

wink

Dernière modification par spinoziste (Le 27/09/2010, à 10:48)


Nous mourrons tous .

Hors ligne

#15 Le 27/09/2010, à 12:14

Ypnose

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

Peut-être qu'en essayant ce qui suis:

tuXtremMerge

Tuxtremsplit et un un programme qui a pour but de recoller les fichiers avec une interface graphique et non avec un script. Ainsi ne pas confondre ce script et Tuxtremsplit qui sont deux choses différentes.

Tuxtremsplit: http://forum.ubuntu-fr.org/viewtopic.php?pid=3752527#p3752527

Dernière modification par Ypnose (Le 27/09/2010, à 12:15)

#16 Le 27/09/2010, à 15:45

Zakhar

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

Je pense surtout que la réponse pertinente pour spinoziste est qu'hélas, mon script ne gère pas le "format exe" des xtm.

Pour cela il faut que tu utilises le Xtremsplit via Wine, ou le programme dont le lien t'a été donné ci-dessus.

Sinon effectivement, la démarche avec mon script, consiste à lui donner le nom que tu veux. Si tu l'as appelé  tuXtremMerge, comme suggéré, et que l'as rendu exécutable par un chmod +x tuXtremMerge, tu le lances alors avec un :

tuXtremMerge  -o fichier.001.xtm

L'option -o (Optimisation) permet d'activer le "turbo", à condition que tu aies déjà tous les fichiers.

Sinon tu peux aussi faire des collages partiels au fur et à mesure que tu télécharges, avec -a (Ajout ou Append), à condition d'avoir le premier et dernier fichier.

... ou aussi sans aucune option, et ça va tout faire tranquillement en séquence.

... mais pour les .exe ... désolé !


Néanmoins, si tu te sens de te lancer dans le script, tu peux toujours l'améliorer pour qu'il le fasse. wink

Dernière modification par Zakhar (Le 27/09/2010, à 15:46)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#17 Le 30/09/2010, à 00:42

spinoziste

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

Merci bien .



Bonne continuation  à vous

wink

Dernière modification par spinoziste (Le 30/09/2010, à 00:44)


Nous mourrons tous .

Hors ligne

#18 Le 29/10/2010, à 13:37

pouchat

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

Un sacré boulot !

De loin le script le plus utile que j'ai vu depuis un bon moment !

Hors ligne

#19 Le 21/11/2010, à 16:47

yakusa77

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

Je test sa, sa m'a l'air d'être du bon taf smile


De vraies interfaces graphique pour vos scripts shell
"Précise 64" | AMD phenom II x4 black édition 965

Hors ligne

#20 Le 22/11/2010, à 12:21

Zakhar

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

@pouchat, @yakusa77,

merci à tous les deux, ça m'encourage à l'améliorer encore... parce que de mon côté j'ai un peu laissé tomber les XTM avec la "quasi-mort" de certains forums !.. wink

Pensez à l'option

-o

... c'est la vraie plus-value du truc qui permet de recoller en vitesse turbo !


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#21 Le 22/11/2010, à 13:10

yakusa77

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

Pas de souci, de toute façon il faut développée pour le coté légal de la chose... trop souvent les programmes sont détourné de leur utilisation première. XTREMSPLIT sert avant a découpé des gros fichiers... âpres l'utilisation qu'on en fait c'est autres choses ... Personnellement je trouve qu'on a besoin d'avoir plein d'alternative au propriétaire, alors je ne peut que t'encouragé à continué à développé pour notre magnifique plate forme.  smile


De vraies interfaces graphique pour vos scripts shell
"Précise 64" | AMD phenom II x4 black édition 965

Hors ligne

#22 Le 20/12/2010, à 09:32

kmchen

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

Excellent. J'ai essayé auparavant 2 autres solutions mieux référencées par Google. Un tuxtremsplit et un Xtremsplit qui n'ont pas fonctionné. Réussite du premier coup avec tuXtremMerge. Documentation claire et en plus on a les sources ! Que demande le peuple ?
Mercixxxx


Création site web
http://www.webologix.com

Hors ligne

#23 Le 22/12/2010, à 17:16

Zakhar

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

Merci pour les encouragements.

Je pense à une version 2 "intelligente". C'est à dire qu'elle ferait toute seule le -o ou le -a selon que tous les fichiers sont là ou pas.
Et si j'arrive à le faire, une version "intelligente +" qui cumule le -a et le -o et qui sait revenir en arrière en cas d'erreur sur le -o.

Cela permettrait de l'associer dans Nautilus aux fichiers .xtm et de pouvoir lancer ensuite avec un clic (droit) de souris.


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#24 Le 30/12/2010, à 13:03

Zakhar

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

30 décembre 2010

J'ai le plaisir de vous annoncer la version 1.5 ! (premier post mis à jour).

Cette version apporte :

  • plus de facilité d'utilisation

  • une meilleure optimisation pour les recollages partiels qui se font désormais en mode "optimisé".

Les options -o (Optimisé ou mode "Turbo") et -a (Ajout ou Append) disparaissent !..

Mais rassurez-vous, comme c'est tout l'intérêt de ce script, ces fonctionnalités sont toujours là... simplement elles ne sont plus optionnelles (pourquoi faire "lent" quand on peut faire "rapide" !) et sont appliquées systématiquement et automagiquement.

Le mode "ajout" sera appliqué automatiquement si le script détecte que vous avez déjà fait un recollage partiel (après vérification que les tailles correspondent bien).
Le mode "Turbo" est désormais le seul mode de recollage, il est appliqué aussi sur le premier fichier (ce n'était pas le cas en 1.2).

Donc désormais vous faites simplement :

tuXtremMerge Mon_Fichier.001.xtm

... et le script détecte tout seul s'il doit ajouter ou pas, et procède toujours en mode optimisé, même lors des ajouts !


Le script fonctionne désormais "à la Firefox" (téléchargements), c'est à dire que pendant le recollage vous verrez votre fichier destination avec une taille à 0, et un fichier portant le même nom avec une extension .part supplémentaire qui va servir à faire le collage. Une fois tous les morceaux recollés, le script termine en renommant le fichier .part

Le script est plus léger (3K de moins) et le source plus clair (j'espère !) puisqu'il y a moins de redondances de code avec une méthode unique de collage.

Limitations :
- Le script ne gère pas les interruptions. (c'est dans le TODO). Donc si vous faites CTRL-C durant l'exécution vous risquez d'avoir un résultat inexploitable. Le contournement est simple, dans ce cas vous relancez le script avec l'option -f (pour forcer l'écrasement) et les opérations recommenceront depuis le début.
- En cas d'erreur de MD5 sur un des fichiers le script effacera le fichier résultat qui est considéré comme incorrect. Contournement : corriger l'erreur MD5 (par exemple tenter de retélécharger s'il s'agit d'un fichier venant du web) et si ce n'est pas possible, vous pouvez toujours relancer avec l'option -n (ignore les MD5)... à vos risques et périls sur l'exploitabilité du résultat !.. En réalité cette limitation provient plus du format lui-même qui se contente de signaler les erreurs mais ne donne aucun moyen pour les corriger ! wink
- Le script ne gère pas les xtm en mode "exécutable" (voir post #14)... et ne les gèrera jamais car cette fonctionnalité n'est pas documentée dans le logiciel privateur d'origine. Contournement : utiliser wine avec le logiciel d'origine... désolé !

Roadmap :
Ce script "intelligent" servira de base à la version graphique. Néanmoins la version graphique sera débarrassée des options secondaires comme le contrôle des MD5 seul, ignorer les MD5, forçage... Pour ces cas très particuliers, il faudra continuer à utiliser la version console.

Dernière modification par Zakhar (Le 30/12/2010, à 23:19)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#25 Le 30/12/2010, à 23:13

Zakhar

Re : tuXtremMerge (XtremSplit TURBO !) - Recoller vos fichier .xtm

30 décembre 2010
Version 1.5.1

  • Sécurité : création du fichier temporaire avec mktemp

  • Amélioration de libellés

  • Ordonnancement plus logique des tests de cohérence initiaux.

  • Optimisations mineures.

Dernière modification par Zakhar (Le 30/12/2010, à 23:14)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne