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

Shell et commandes GNU Discussion :

Boucle infinie de fichiers


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 17
    Par défaut Boucle infinie de 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)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    #/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 :o). 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!

  2. #2
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Pourquoi ne pas utiliser les options de cp?

    Quelques options qui peuvent t’intéresser
    http://manpages.ubuntu.com/manpages/...man1/cp.1.html
    Citation Envoyé par man cp

    -p identique à --preserve=mode,ownership,timestamps

    -u, --update
    ne copier que si le fichier source est plus récent que le
    fichier destination ou si celui-ci n’existe pas

    -R, -r, --recursive
    copier récursivement les répertoires


  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 17
    Par défaut
    Je ne savais tout simplement pas que ça existait. Merci ça sera plus simple

    Une idée pour la boucle sinon?

  4. #4
    Modérateur
    Avatar de paissad
    Homme Profil pro
    Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Inscrit en
    Avril 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 043
    Par défaut
    Bonjour,
    connais-tu rsync ? si non tu devrais l'utiliser car il est mieux fait pour le travail que tu sembles vouloir effectuer.
    Si par contre tu connais rsync mais que tu ne veux pas l'utiliser, je n'en vois pas la raison valable
    Avec un rsync, ça tiendrait sur une ou deux lignes avec peu d'arguments au lieu de faire des boucles ...

    Cordialement,
    Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
    Le chat du site est aussi ici pour aider. Ne pas hésiter à visiter !

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 677
    Par défaut
    Bonjour,

    Bien sûr, rsync !
    mais ça gâche tout le plaisir de faire des scripts


    Pour le script :
    si nb_Arg = 3, alors pc n'est pas assigné
    donc quand ton script est rappelé (j'aurais utilisé une fonction récursive) avec 3 arguments, il redémarre depuis la racine /
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. Boucle infini importation fichiers .txt
    Par cyrus87 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/03/2014, 11h45
  2. [WD12E] boucle infinie - lecture fichier
    Par nagadscar dans le forum WinDev
    Réponses: 7
    Dernier message: 12/07/2010, 12h20
  3. boucle infinie au lancement du fichier
    Par geraldh713 dans le forum Access
    Réponses: 2
    Dernier message: 15/08/2007, 16h35
  4. Réponses: 16
    Dernier message: 03/11/2005, 19h33
  5. Modification d'un fichier (boucle infinie)
    Par poof65 dans le forum C
    Réponses: 8
    Dernier message: 18/09/2005, 19h12

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