Pages : 1
#1 Le 14/05/2011, à 17:13
- chimay
Synchronisation rapide
Avertissement : je ne garantis naturellement pas l'absence de bug, donc lisez bien le code et testez le ; si vous trouvez des erreurs ou des améliorations possibles, merci de me les signaler
Dépendances : zsh
Correction de bug :
section concernant les suppressions de répertoires absents dans la source :
cd dest/repertoire || continue
au cas où le répertoire a déjà été effacé
Pourquoi un script de synchronisation alors qu'il existe déjà des outils comme rsync et unison ? Tout simplement parce ces derniers, habituellement performants, "rament" lorsqu'ils scannent des fichiers audio/vidéo. Le but est donc de faire une petite synchro élémentaire vite fait bien fait, sans devoir sortir l'artillerie lourde.
Il s'agit d'une synchronisation unidirectionnelle, source --> destination (contrairement à unison qui est bidirectionnel). Que fait ce script ? Plusieurs choses :
Il copie vers la destination les fichiers/répertoires qui ont été ajouté dans la source
Il supprime de la destination les fichiers/répertoires qui ont été supprimés de la source
Avec l'option "up", il met à jour les fichiers plus récents dans la source
L'option "safe" permet (sauf bug que j'ignore) de faire une simulation des opérations, sans réellement synchroniser. Donc, l'utilisation en résumé :
synchronise.zsh [up] [safe] répertoire-source répertoire-destination
Voilà le script :
#!/bin/zsh
# {{{ Options de zsh
setopt null_glob
# }}}
# {{{ Options
modeSecurise=0
miseAJour=0
boucle=1
while [[ $boucle -eq 1 ]]
do
case $1 in
"safe")
modeSecurise=1
shift
;;
"up")
miseAJour=1
shift
;;
*)
boucle=0
;;
esac
done
echo "Mode sécurisé : $modeSecurise"
echo ""
echo "Mise à jour : $miseAJour"
echo ""
# }}}
# {{{ Répertoires
depart=$PWD
src=${1:-"${HOME}/audio"}
dest=${2:-"${HOME}/Musique/de-audio"}
echo "Depart : $depart"
echo ""
echo "Source : $src"
echo "Destination : $dest"
echo ""
# }}}
# {{{ Copie des repertoires manquants dans la destination
echo ""
echo "================================================"
echo "Copie des repertoires manquants dans la destination"
echo "================================================"
echo ""
cd $src
for repertoire in **/*(/)
do
echo "------------ Entree dans ${src}/${repertoire}"
cd ${src}/${repertoire}
destination=${dest}/${repertoire}
for repSrc in *(/)
do
if [[ ! -d ${destination}/${repSrc} ]]
then
echo "cp -R $repSrc $destination"
if [[ $modeSecurise -eq 0 ]]
then
cp -R $repSrc $destination
fi
fi
done
done
# }}}
# {{{ Suppression des repertoires absents dans la source
echo ""
echo "================================================"
echo "Suppression des repertoires absents dans la source"
echo "================================================"
echo ""
cd $dest
for repertoire in **/*(/)
do
echo "------------ Entree dans ${dest}/${repertoire}"
cd ${dest}/${repertoire} || continue
sourcier=${src}/${repertoire}
for repDest in *(/)
do
if [[ ! -d ${sourcier}/${repDest} ]]
then
echo "rm -rf $repDest"
if [[ $modeSecurise -eq 0 ]]
then
rm -rf $repDest
fi
fi
done
done
# }}}
# {{{ Copie des fichiers manquants dans la destination
echo ""
echo "================================================"
echo "Copie des fichiers manquants dans la destination"
echo "================================================"
echo ""
cd $src
for repertoire in **/*(/)
do
echo "------------ Entree dans ${src}/${repertoire}"
cd ${src}/${repertoire}
destination=${dest}/${repertoire}
for fichierSrc in *(.)
do
if [[ ! -f ${destination}/${fichierSrc} ]]
then
echo "cp $fichierSrc $destination"
if [[ $modeSecurise -eq 0 ]]
then
cp $fichierSrc $destination
fi
fi
done
done
# }}}
# {{{ Suppression des fichiers absents dans la source
echo ""
echo "================================================"
echo "Suppression des fichiers absents dans la source"
echo "================================================"
echo ""
cd $dest
for repertoire in **/*(/)
do
echo "------------ Entree dans ${dest}/${repertoire}"
cd ${dest}/${repertoire}
sourcier=${src}/${repertoire}
for fichierDest in *(.)
do
if [[ ! -f ${sourcier}/${fichierDest} ]]
then
echo "rm -f $fichierDest"
if [[ $modeSecurise -eq 0 ]]
then
rm -f $fichierDest
fi
fi
done
done
# }}}
# {{{ Mise a jour des fichiers dans la destination
if [[ $miseAJour -eq 0 ]]
then
exit 0
fi
echo ""
echo "================================================"
echo "Mise a jour des fichiers dans la destination"
echo "================================================"
echo ""
cd $src
for repertoire in **/*(/)
do
echo "------------ Entree dans ${src}/${repertoire}"
cd ${src}/${repertoire}
destination=${dest}/${repertoire}
for fichierSrc in *(.)
do
fichierDest=${destination}/${fichierSrc}
if [[ $fichierSrc -nt $fichierDest ]]
then
hacheSrc=`md5sum ${fichierSrc} | cut -d ' ' -f 1`
hacheDest=`md5sum ${fichierDest} | cut -d ' ' -f 1`
#echo "[[ $fichierSrc -nt ${fichierDest} ]]"
#echo ""
echo "$hacheSrc $hacheDest"
echo ""
if [[ "$hacheSrc" != "$hacheDest" ]]
then
echo "cp $fichierSrc $destination"
echo ""
if [[ $modeSecurise -eq 0 ]]
then
cp $fichierSrc $destination
fi
else
echo "touch $fichierDest"
echo ""
if [[ $modeSecurise -eq 0 ]]
then
touch $fichierDest
fi
fi
fi
done
done
# }}}
sync
cd $depart
Dernière modification par chimay (Le 16/05/2011, à 14:03)
* Linux est écolo : le code est tout vert
* Un dauphin nage plus vite qu'un nautile nain
* Le but d'un système d'exploitation est d'exploiter l'ordinateur, pas l'utilisateur
* Un ordinateur est composé d'un piano, d'une mangeuse de fromage, d'une mémoire d'éléphant, d'une dalle, d'un lecteur de galette, et d'un moulin, le célèbre moulin de la galette
Hors ligne
Pages : 1