#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 ). 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