IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Problème Algorithmique pour Script Backup


Sujet :

Linux

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Par défaut Problème Algorithmique pour Script Backup
    BOnjour à tous, je code actuellment un script en shell (.sh) pour sauvegarder des dossiers, mais mopn souci est que je n'arrive pas à comparer les fichiers sauvegarder et ceux à sauvegarder pour savoir s'il y a eu modification ou non.
    Je cherche donc une solution à mon probleme donc si quelqu'un à une idée pour m'aiguiller ... je suis preneur.

    Merci

  2. #2
    Membre chevronné Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Par défaut
    man diff

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Par défaut
    je n'ai pas demander qu'on me balance une commande ...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Par défaut
    j'ai exécute le script de al1 24 savefile.ksh et il me return une erreur
    ./savefile.sh : line 86: return: can only `return`from a function or sourced script.
    si quelqu'un a une idée d'ou ca peut venir

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Août 2008
    Messages : 505
    Par défaut
    C'est très bien de chercher à faire les choses par soi-même. Cela dit, sur la question de la synchronisation des fichiers, il y a d'excellents logiciels pour le faire : le plus connu est rsync.
    Si tu veux comparer les dates de dernières modifications, il faut regarder du coté de "ls".
    Si tu veux comparer le contenu des fichier, diff ne me parait pas le bon choix. Il me semble plus efficace de faire un md5 du contenu du fichier et de le comparer au md5 de l'autre. si les deux sont égaux, ils sont identiques.

    Quant à ton erreur, j'ai peur que personne ne te réponde. D'une part parce qu'on ne sait ce qu'il y a dans ton script, et d'autre part parce que déboguer les scripts shells des autres est très ennuyeux. Le mieux que tu ait à faire, pour moi, c'est de mettre un -x après ton #!/bin/sh histoire de voir ou ça part en vrille.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Par défaut
    merci pour ta réponse je vais choisir la solution la plus adaptée a mes besoins, j'ai donc changé mon code et réutiliser celui de al1 24. je vous donne donc le code.Maintenant j'ai une erreur qui signifie qu'il y a un souci au niveua du 1er IF mais je ne trouve pas pourquoi puisque mon fichier source existe bien et que mes 2 variables on bien leur parametre.

    #! /bin/sh
    typeset RepBackup="./backup" ;
    typeset RepSource="./Test" ;

    #Date du jour
    typeset date=$(date +%d%m%y-%H%M);
    echo "La date d aujourd'hui est :" = $date

    # Si les paramètres de RepBackup et RepSource sont renseignés et la source existe
    if [[ -n "${RepSource}" ]] && [[ -n "${RepBackup}" ]] && [[ -e "${RepSource}" ]] ;
    then
    # Si les fichiers sont différents
    if ! [[ "${RepSource}" -ef "${RepBackup}" ]] ;
    then
    # Si RepBackup existe déjà
    if [[ -e "${RepBackup}" ]] ;
    then
    # Extraire les parties
    typeset _FileExt="${RepBackup##*.}" ;
    typeset_FileName="${RepBackup%.*}" ;

    # Préparer les noms de fichier
    typeset _AddExt=$("${Date}" d "${_SaveFile}") ;
    typeset _TempFile="${_FileName}.${_AddExt}.${_FileExt}" ;

    # Si une sauvegarde existe déjà
    if [[ -e "${_TempFile}" ]] ;
    then
    # Renommer la sauvegarde existante
    _AddExt=$("${Date}" t "${_TempFile}")

    mv "${_TempFile}" "${_FileName}.${_AddExt}.${_FileExt}" || return $?
    else echo "sauvegarde deja existante"
    fi
    # Renommer le fichier à sauvegarder
    mv "${_SaveFile}" "${_TempFile}" || return $?
    else echo "repertoire backup n existe pas"
    fi
    # Enregistrer la nouvelle version
    mv "${_SrcFile}" "${_SaveFile}" || return $?
    else
    return 0
    fi
    else
    echo "erreur du 1er IF"
    fi
    exit 0

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Août 2008
    Messages : 505
    Par défaut
    Moi y en a perplexe sur la façon dont tu écris les crochets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [[ -n "${RepSource}" ]] && [[ -n "${RepBackup}" ]] && [[ -e "${RepSource}" ]] ;

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Par défaut
    j'ai testé avec ceci et ca ne change rien toujours la meme erreur
    if [ -n "${RepSource}" ] && [ -n "${RepBackup}" ] && [ -e "${RepSource}" ] ;
    et ca aussi
    if [ -n "${RepSource}" ] && [ -n "${RepBackup}" ] && [ -e "${RepSource}" ] ;
    mais avec ceci il me dit que j'ai des erreurs de syntaxe dans mon expression de la condition.
    Merci à ceux qui réflechisse sur mon probleme

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 290
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ -n "${RepSource}" -a -n "${RepBackup}" -a -e "${RepSource}" ]
    Ca doit fonctionner.
    Que ce soit avec la commande test ou [ ... ], le ET logique pour ta condition est -a.
    Ce que tu as fait équivaut à taper plusieurs commande après le if (il n'aime pas).
    Remarque, si tu es joueur, tu peux essayer ça (j'ai pas testé mais ça peut marcher):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if { [ -n "${RepSource}" ] && [ -n "${RepBackup}" ] && [ -e "${RepSource}" ] ; }

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Par défaut
    j'ai ajouté "set -x" a mon programme et voici ce ue j'obtien

    $ ./test.sh
    + typeset RepBackup=./backup
    + typeset RepSource=./Test
    ++ date + %d%m%y-%H%M
    + typeset date=200908-0007
    +echo 'la date d oujourd'hui est : =200908-0007
    + '[' -n ./Test -a -n ./backup -a -e ./Test ']'
    +echo 'erreur 3'
    erreur 3
    +exit 0

    voila si ca peut vous aiguille sur une solution...

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 290
    Par défaut
    Change déjà la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # Enregistrer la nouvelle version
    mv "${_SrcFile}" "${_SaveFile}" || return $?
    else
    return 0
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # Enregistrer la nouvelle version
    mv "${_SrcFile}" "${_SaveFile}" || return $?
    else
    exit 0
    car comme il te la dit :
    can only `return`from a function or sourced script.
    Tu as changé ton script pour mettre le echo 'erreur 3' ? Ton script fonctionne on dirait (il fini par exécuter exit 0)
    (si tu remets ta source, tu peux l'indenter stp parce que là on se perd un peu dans les if)

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Par défaut
    voici le code .

    #! /bin/sh
    set -x
    typeset RepBackup="./backup"
    typeset RepSource="./Test"

    #Date du jour
    typeset date=$(date +%d%m%y-%H%M);
    echo "La date d aujourd'hui est : = $date"

    # Si les paramètres de RepBackup et RepSource sont renseignés et la source existe

    if [ -n "${RepSource}" -a -n "${RepBackup}" -a -e "${RepSource}" ]

    then
    # Si les fichiers sont différents
    if ! [ "${RepSource}" -ef "${RepBackup}" ] then
    # Si la cible existe déjà
    if [[ -e "${RepBackup}" ]]
    then
    # Extraire les parties
    typeset _FileExt="${RepBackup##*.}"
    typeset _FileName="${RepBackup%.*}"
    # Préparer les noms de fichier
    typeset _AddExt=$("${Date}" d "${_SaveFile}")
    typeset _TempFile="${_FileName}.${_AddExt}.${_FileExt}"

    # Si une sauvegarde existe déjà
    if [[ -e "${_TempFile}" ]]
    then
    # Renommer la sauvegarde existante
    _AddExt=$("${Date}" t "${_TempFile}")

    mv "${_TempFile}" "${_FileName}.${_AddExt}.${_FileExt}" || return $?
    else echo "sauvegarde deja existante"
    fi
    # Renommer le fichier à sauvegarder
    mv "${_SaveFile}" "${_TempFile}" || return $?
    else echo "repertoire backup n existe pas"
    fi
    # Enregistrer la nouvelle version
    mv "${_SrcFile}" "${_SaveFile}" || return $?
    else
    exit 0
    fi
    else
    echo "erreur 3"

    fi
    exit 0

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Par défaut
    voici les messages d'erreurs récupérer dans un log

    + typeset RepBackup=./backup
    + typeset RepSource=./Test
    ++ date +%d%m%y-%H%M
    + typeset date=200908-1924
    + echo 'La date d aujourd'\''hui est : = 200908-1924'
    + '[' -n ./Test -a -n ./backup -a -e ./Test ']'
    + echo 'erreur 3'
    + exit 0

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Par défaut
    Citation Envoyé par Ph4rell Voir le message
    voici le code .

    #! /bin/sh
    set -x
    typeset RepBackup="./backup"
    typeset RepSource="./Test"

    #Date du jour
    typeset date=$(date +%d%m%y-%H%M);
    echo "La date d aujourd'hui est : = $date"

    # Si les paramètres de RepBackup et RepSource sont renseignés et la source existe

    if [ -n "${RepSource}" -a -n "${RepBackup}" -a -e "${RepSource}" ]

    then
    # Si les fichiers sont différents
    if ! [ "${RepSource}" -ef "${RepBackup}" ] then
    # Si la cible existe déjà
    if [[ -e "${RepBackup}" ]]
    then
    # Extraire les parties
    typeset _FileExt="${RepBackup##*.}"
    typeset _FileName="${RepBackup%.*}"
    # Préparer les noms de fichier
    typeset _AddExt=$("${Date}" d "${_SaveFile}")
    typeset _TempFile="${_FileName}.${_AddExt}.${_FileExt}"

    # Si une sauvegarde existe déjà
    if [[ -e "${_TempFile}" ]]
    then
    # Renommer la sauvegarde existante
    _AddExt=$("${Date}" t "${_TempFile}")

    mv "${_TempFile}" "${_FileName}.${_AddExt}.${_FileExt}" || return $?
    else echo "sauvegarde deja existante"
    fi
    # Renommer le fichier à sauvegarder
    mv "${_SaveFile}" "${_TempFile}" || return $?
    else echo "repertoire backup n existe pas"
    fi
    # Enregistrer la nouvelle version
    mv "${_SrcFile}" "${_SaveFile}" || return $?
    else
    exit 0
    fi
    else
    exit 0"

    fi
    exit 0
    voici le nouveau code, merci a toi drawingrom pour ton aide
    donc la mainteant le script s'execute bien mais il reste quelque pbme.
    puisqu'il me dit que la sauvegarde est existante alors que non. donc il y a un souci au niveau du 2 if et je pense aussi qu 'il y a un pbme avec le renommage des sauvegardes avec la variable $date.
    à voir

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Par défaut
    Citation Envoyé par Ph4rell Voir le message
    voici le nouveau code, merci a toi drawingrom pour ton aide
    donc la mainteant le script s'execute bien mais il reste quelque pbme.
    puisqu'il me dit que la sauvegarde est existante alors que non. donc il y a un souci au niveau du 3 if et je pense aussi qu 'il y a un pbme avec le renommage des sauvegardes avec la variable $date.
    à voir

  16. #16
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 290
    Par défaut
    Ah ben ça c'est peu de choses

    1. Je ne comprends pas pourquoi il y a tous ces typeset. Personnellement, je m'en sert que quand je veux un type bien précis autre qu'une chaine (genre des entiers). Après, j'aimerais bien avoir l'avis d'un master ès sh...

    2. À ta place, j'éviterais de donner des noms de commandes pour tes variables, je trouve que ça prête à confusion. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typeset date=$(date +%d%m%y-%H%M);
    3. Je ne comprends pas toutes tes manipulations avec date... Dans tous les cas, si tu veux récupérer ta variable en ligne 7, c'est $date et pas $Date : le nom des variables est sensible à la casse.

    PS: par indenter, j'entendais mettre un peu de tabulation, pas des couleurs (ouch mes yeux avec le vert flashy sur gris)

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Par défaut
    Ouai dsl pour la mise ne6 page, mais quand j'indentais le code, c'était encore moins lisible.

    #! /bin/sh
    set -x
    typeset RepBackup="backup"
    typeset RepSource="./Test"

    #Date du jour
    typeset date=$(date +%d%m%y-%H%M);
    echo "La date d aujourd'hui est : = $date"

    # Si les paramètres de RepBackup et RepSource sont renseignés et la source existe

    if [ -n "${RepSource}" -a -n "${RepBackup}" -a -e "${RepSource}" ]

    then
    # Si les fichiers sont différents
    if ! [ "${RepSource}" -ef "${RepBackup}" ]
    then
    # Si la cible existe déjà
    if [[ -e "${RepBackup}" ]]
    then
    # Extraire les parties
    typeset _FileExt="${RepBackup##*.}"
    typeset _FileName="${RepBackup%.*}"

    # Préparer les noms de fichier
    typeset _AddExt="$(${date}.${RepSource}}"
    typeset _TempFile="${_FileName}.${_AddExt}.${_FileExt}"

    # Si une sauvegarde existe déjà
    if [[ -e "${_TempFile}" ]]
    then
    # Renommer la sauvegarde existante
    _AddExt=$("${Date}" t "${_TempFile}")

    mv "${_TempFile}" "${_FileName}.${_AddExt}.${_FileExt}" || exit 1
    else echo "sauvegarde deja existante"
    fi
    # Renommer le fichier à sauvegarder
    mv "${RepBackup}" "${_TempFile}" || exit 1
    else echo "repertoire backup n existe pas"
    fi
    # Enregistrer la nouvelle version
    mv "${_SrcFile}" "${RepBackup}" || exit 1
    else
    return 0
    fi
    else
    exit 0
    fi
    exit 0
    Bon voila le code auquel je suis parvenu, qui ne marche pas encore ^
    À ta place, j'éviterais de donner des noms de commandes pour tes variablesQu'est ce que tu mettrai a la place??

    Voici les nouvelles erreurs. sachant que la copie de fonctionne toujours pas.
    + typeset RepBackup=backup
    + typeset RepSource=./Test
    ++ date +%d%m%y-%H%M
    + typeset date=220908-1201
    + echo 'La date d aujourd'\''hui est : = 220908-1201'
    ./test.sh: line 43: unexpected EOF while looking for matching `"'
    ./test.sh: line 51: syntax error: unexpected end of file

  18. #18
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 290
    Par défaut
    Ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typeset _AddExt="$(${date}.${RepSource}}"
    Tu ouvre une ( que tu termine en }. Tu ne veux pas faire plutot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _AddExt="${date}.${RepSource}"
    ?
    Tu n'as pas corrigé ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # Renommer la sauvegarde existante
    _AddExt=$("${Date}" t "${_TempFile}")

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Par défaut
    bon ba mon code marche tres bien, merci de ton aide drawingrom, je le posterai surement plus tard quand il sera completement fini !!

  20. #20
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 290
    Par défaut
    Cooli ! Du coup tu peux mettre un ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/02/2015, 18h32
  2. problème algorithmique difficile pour moi
    Par torjancss dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 24/05/2014, 12h49
  3. Réponses: 12
    Dernier message: 02/02/2013, 00h14
  4. [débutant] [BASH] problème script backup
    Par julien.63 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 13/04/2008, 18h56
  5. aides pour script en shell
    Par komatek dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 12/08/2003, 15h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo