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"