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 01/05/2012, à 14:03

Fabien.r

(shell) Boucle infinie sur fichiers

Bonjour à tous,

J'ai un petit problème que je ne comprend pas, en effet j'ai écris un petit script me permettant de sauvegarder des fichiers sur un serveur si ceux ci sont plus récents sur mon pc que sur mon serveur.
Il marche très bien sur mon pc portable mais sur mon pc fixe il tourne à l'infinie. (Pour tester j'ai pourtant la même arborescence de répertoires et fichiers à copier)

 
#/bin/sh
 
ping -c 1 "192.168.1.100" > /dev/null                #test du réseau
if [ $? -ne 0 ]
then
    echo "Le serveur n'est pas accessible."
    exit 1
fi
 
mount | grep "//192.168.1.100" > /dev/null            #test du montage
if [ $? -eq 1 ]
then
    echo "Le montage n'est pas disponible."
    exit 2
fi
 
if [ $# -eq 1 ]
then
    pc="/home/fabien/Documents/$1"
    serveur="/media/Partage/BackUp/Backup_pc/$1/"
    rep="$1"
else
    pc="/home/fabien/Documents"
    serveur="/media/Partage/BackUp/Backup_pc/"
    rep=""
fi
 
if [ $# -eq 3 ]
then
    nbfic="$2"
    taillefic="$3"
else
    nbfic=0
    taillefic=0
fi
 
for ficourep in "$pc"/*
do
   fic=`basename "$ficourep"`
   echo "$fic"
   if [ -f "$ficourep" ]                     #si le "fic" est un fichier
   then
      if [ ! -f "$serveur$fic" ]                 #si le fic n'est pas présent sur le serveur
    then
        echo "Copie de $fic"
        cp "$ficourep" "$serveur"
        tfic=`stat -c %s "$ficourep"`
        taillefic=`expr $taillefic + $tfic`
        nbfic=`expr $nbfic + 1`
    else                             #si le fic est déjà présent
        date_serv=`stat -c "%Y" "$serveur$fic"`
        date_pc=`stat -c "%Y" "$ficourep"`
        if [ "$date_pc" -gt "$date_serv" ]         #si le fic est plus récent
        then
            echo "Copie de $fic"
            cp "$ficourep" "$serveur"
            tfic=`stat -c %s "$ficourep"`
            taillefic=`expr $taillefic + $tfic`
            nbfic=`expr $nbfic + 1`
        fi
    fi
   elif [ -d "$ficourep" ]                    #si le "fic" est un repertoire
   then    
    if [ ! -d $serveur$fic ]                #si le "fic" n'existe pas sur le serveur
    then                            
        mkdir $serveur$fic
    fi                            
    sh "$0" "$rep/$fic" $nbfic "$taillefic"
   fi    
done
 
tailletot="$taillefic octet"
 
if [ $taillefic -gt 1024  -a $taillefic -lt 1048576 ]
then
    taillefic=$(echo "scale = 2; $taillefic/1024" | bc)
    tailletot="$taillefic ko"
elif [ $taillefic -gt 1048576 ]
then
    taillefic=$(echo "scale = 2; $taillefic/1024" | bc)
    tailletot="$taillefic mo"
fi
 
if [ $nbfic -gt 1 ]
then
    nbtot="$nbfic fichiers"
else [ $nbfic -eq 1 ]
    nbtot="$nbfic fichier"
fi
 
echo "$nbtot mis à jour pour un total de $tailletot"
 
exit 0

Après quelques tests je me suis rendu compte que c'est la boucle for qui ne marche pas correctement (que sur mon pc fixe yikes). En effet j'ai un répertoire "ARM" dans /home/fabien/Documents/ et la boucle affiche à l'infinie "ARM".

Mes 2 pc tournent sous ubuntu 12.04

Merci de votre aide!

PS : On m'a indiqué les options de cp qui faciliterai le code, mais mon problème est surtout cette boucle infinie.

Hors ligne

#2 Le 01/05/2012, à 15:06

twocats

Re : (shell) Boucle infinie sur fichiers

if [ $nbfic -gt 1 ]
then
    nbtot="$nbfic fichiers"
else [ $nbfic -eq 1 ]
    nbtot="$nbfic fichier"
fi

Pas bon

if [ $nbfic -gt 1 ]
then
    nbtot="$nbfic fichiers"
elif [ $nbfic -eq 1 ]
    nbtot="$nbfic fichier"
fi

Bon.
Pour le reste je vois pas. Tu es limité à sh ?


La réponse est 42

Hors ligne

#3 Le 01/05/2012, à 15:40

Fabien.r

Re : (shell) Boucle infinie sur fichiers

if [ $nbfic -gt 1 ]
then
    nbtot="$nbfic fichiers"
elif [ $nbfic -eq 1 ]
    nbtot="$nbfic fichier"
fi

Ca ne marche pas si nbtot=0

Euh non je ne suis pas vraiment limité à sh, mais ce qui m'étonne c'est que ça marche sur un pc et pas sur l'autre.

Hors ligne

#4 Le 01/05/2012, à 16:12

pingouinux

Re : (shell) Boucle infinie sur fichiers

Bonjour,
Comment est appelé le script, quand il fonctionne, et quand il boucle ?

Pour l'autre problème :

if [ $nbfic -gt 1 ]
then
    nbtot="$nbfic fichiers"
else
    nbtot="$nbfic fichier"
fi

ou

nbtot="$nbfic fichier"
[ $nbfic -gt 1 ] && nbtot="${nbtot}s"

Hors ligne

#5 Le 01/05/2012, à 17:03

pingouinux

Re : (shell) Boucle infinie sur fichiers

Le script me paraît un peu compliqué, mais ceci devrait améliorer les choses :

  • Remplacer les lignes 17 à 22 par :

    if [ $# -ge 1 ] 
    then
        pc="/home/fabien/Documents/$1"
        serveur="/media/Partage/BackUp/Backup_pc/$1/"
        rep="$1/"
  • Remplacer la ligne 68 par :

        sh "$0" "$rep$fic" $nbfic "$taillefic"

Hors ligne

#6 Le 08/05/2012, à 01:48

kuri

Re : (shell) Boucle infinie sur fichiers

Je devie un peu mais ... utiliser rsync etait inconcevable ?

Hors ligne