Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile

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