Le Sat, 14 Dec 2002 21:39:47 -0400, jipe a �crit :

> rien ne t'emp�che de faire commencer ton script par un cd $REP
> tu le lances d'o� tu veux mais il d�marre dans $REP et du coup tes
> chemins deviennent corrects.

Bien s�r, et c'est d'ailleurs ce que j'avais fait dans l'"urgence" :-)

> si ton arborescence dans tes 2 r�pertoires � synchroniser est la m�me,
> cad sans modification de la casse, et que seuls les noms de fichiers
> passent de minuscule en majuscules,  il faut prot�ger le chemin.
> regarde comment fonctionne ceci:
> 
> OIFS=$IFS; IFS=$'\n\r\t'; for i in $(find -type f); do echo ${i%/*}/$(echo ${i##*/} 
>| tr a-z A-Z); done; IFS=$OIFS
> 
> $i = ./rep1/rep2/toto
> ${i##*/} supprime tous les carat�res depuis le d�but de $i jusqu'au
> dernier / rencontr� -> toto
> avec tr a-z A-z en pipe, �a devient TOTO
> ${i%/*} supprime tous les caract�res depuis la fin jusqu'au premier
> / rencontr� -> ./rep1/rep2
> donc echo ${i%/*}/$(echo ${i##*/} | tr a-z A-Z) -> ./rep1/rep2/TOTO

C'est parfaitement clair !

> ne pas oublier le / entre les 2 variables puisqu'il est supprim� dans
> les 2 variables.

Evidemment.

> je te laisse regarder ce que donnent ${i#*/} et ${i%%/*}.

Vu !
C'est quelque chose que j'avais d�j� su, mais ne pratiquant pas vraiment,
j'ai toujours du mal � me souvenir du fonctionnement exact.

> maintenant admettons que tu ne fasse pas un cd au d�but du script
> mais que tu as d�fini 2 variables pour les r�pertoires source et cible:
> SYNCSRC=/home/toto/repA
> SYNCCIB=/home/toto/repB
> si tu tapes la ligne suivante:
> OIFS=$IFS; IFS=$'\n\r\t'; for i in $(find $SYNCSRC -type f); do 
>a=${i/$SYNCSRC/$SYNCCIB}; echo ${a%/*}/$(echo ${i##*/} | tr a-z A-Z); done; IFS=$OIFS
> si $i est        /home/toto/repA/rep1/rep2/toto
> le r�sultat sera /home/toto/repB/rep1/rep2/TOTO
>                  ~~~~~~~~~~~~~~~           ~~~~ <- j'ai soulign� :)
> tu as trouv� le nom, chang� en majuscule, du fichier correspondant
> dans l'arborescence du repertoire repB
> ici ${i/$SYNCSRC/$SYNCCIB} permet de changer la premi�re
> occurence rencontr�e dans $i de $SYNCSRC par $SYNCCIB
> ${var/a/b} change le premier a en b dans $var
> ${var//a/b} change tous les a en b dans $var

Impec !
Mon (ton) script est donc devenu :

-----------------------------------------------------------
#!/bin/bash
# Synchronisation du r�p $1 vers le r�p $2

SYNCSRC="$1/"   # r�pertoire source
SYNCCIB="$2/"   # r�pertoire cible

if !([ -d $SYNCSRC ]) || !([ -d $SYNCCIB ])
        then
                echo "La syntaxe correcte d'appel du script est :"
                echo "\"synchro /le/r�pertoire/source /le/r�pertoire/cible\""
                exit
fi

REMPL=0

OIFS=$IFS
IFS=$'\n\r\t'
for orig in $(find $SYNCSRC -type f); do
        a=${orig/$SYNCSRC/$SYNCCIB}
        CIBLE=${a%/*}/$(echo ${orig##*/} | tr A-Z a-z)
        IFS=" "
        array=($(ls -l "$orig"))
        date=$(echo "${array[5]} ${array[6]} ${array[7]}")
        if [ -f "$CIBLE" ]
                then    
                        ARRAY=($(ls -l "$CIBLE"))
                        DATE=$(echo "${ARRAY[5]} ${ARRAY[6]} ${ARRAY[7]}")
                        if [ "$DATE" != "$date" ]
                                then
                                        echo "remplacement de $CIBLE par $orig de date 
diff�rente"
                                        cp -fp "$orig" "$CIBLE"
                                        REMPL=$((REMPL+1))
                        fi
                else
                        echo "ajout de $CIBLE"
                        cp -fp "$orig" "$CIBLE"
                        REMPL=$(($REMPL+1))
        fi
done
IFS=$OIFS
if [ $REMPL = 0 ]
        then
                echo "Aucun mise � jour n�cessaire"
        else
                echo "$REMPL fichier(s) remplac�s"
fi
---------------------------------------------------------

Son seul d�faut � mon go�t - qui ne me g�ne pas dans le cas pr�sent mais
qui pourrait lui �tre repproch� dans le cas g�n�ral - c'est de remplacer
des fichiers m�me plus r�cents, � partir du moment ou la date est
diff�rente.
Ceci bien entendu parce qu'on ne peut pas faire de test d'inf�riorit� �
cause du format de la date.
Pour cela, il faudra l'avoir de la forme : aaaa-mm-jj-hh-nn
avec
aaaa = ann�e
mm = mois
jj = jour
hh = heure
nn = minute

Mais l�, �a doit impliquer l'usage d'autres fonction pour transcrire la
date dans ce format, et il suffirait ensuite de changer le test sur la
date par un "<"

> un petit appart� si tu permet ;)

Bon voyons. Et comment donc !

> je t'ai propos� une variable tableau dans le premier script de test.
> ces variables peuvent se passer de bien des commandes grep sed ou
> autre awk en d�finissant des champs qu'il suffit d'explorer. c'est tr�s
> rapide :) 

Je vois �a oui. Encore quelque chose � retenir ;-)

> par exemple je d�finis CNX comme �tant un tableau obtenu avec la
> commande /sbin/ifconfig ppp0
> CNX=($(/sbin/ifconfig ppp0)) <- remarque les () autour de la
> commande elle m�me dans $()
> echo ${CNX[0]} donne le premier champ -> ppp0 
> je peux explorer les divers champs en changeant le nombre entre []
> mon adresse IP est dans le champ 5 (le sixi�me ! normal �a commence � 0)
> echo ${CNX[5]} -> adr:183.25.163.15
> je peux appliquer les substitutions suivantes pour avoir un r�sultat correct.
> echo ${CNX[5]:4} -> 183.25.163.15 # je supprime les 4 1ers caract�res
> echo ${CNX[5]/adr:/} -> 183.25.163.15 # je supprime adr: (je le
> remplace par rien !)
> echo ${CNX[5]#*:} -> 183.25.163.15 # je supprime tout ce qui pr�c�de
> le : et lui avec.
> pour connaitre son adresse IP � tout moment, il suffit donc de taper:
> CNX=($(/sbin/ifconfig ppp0)); echo ${CNX[5]#*:}

Aussit�t conseill�, aussit�t appliqu� :-)

> on peut en faire un alias dans ~/.bashrc ou ailleurs:
> alias ipad='CNX=($(/sbin/ifconfig ppp0)); echo ${CNX[5]#*:}'
> il suffit alors de taper ipad pour connaitre son adresse IP

Moi je l'ai inclu dans un script (donn� par toi si me souviens bien) qui
inclue du texte dans une fen�tre, script gr�ce auquel j'ai ma vitesse de
connexion et mon adresse IP qui s'affiche pendant 5 secondes dans une
fenetre lors du clic sur une icone sur le bureau :-)

> bon, je voudrais pas faire trop long juste pour un petit script que tu
> as du d�j� faire fonctionner correctement ... :)

C'�tait parfait. Et je (et je ne pense pas parler qu'en mon nom) suis
toujours tr�s frillant de tes explications toutes aussi p�dagogiques et
ludiques.

J'en encore appris plein de choses rien qu'avec ces explications.

Merci encore.

-- 
Christophe PEREZ

Vous souhaitez acquerir votre Pack ou des Services MandrakeSoft?
Rendez-vous sur "http://www.mandrakestore.com";

Répondre à