Synchronisation arbo mediathèque

Synchronisation arbo mediathèque - Shell/Batch - Programmation

Marsh Posté le 24-11-2012 à 16:53:38    

Bonjour,
 
Pour chaque album que j'achète dans le commerce (2, 3 par mois), je les RIP sur mon PC en FLAC, les disques vont dans la voiture et les FLAC sur mon "NAS" afin d'y avoir accès sur n'importe quel PC sur mon réseau local.
 
Puis je me suis acheté récemment un baladeur numérique (SanDisk Sansa+) et bien qu'il lise les FLAC je prèfère y mettre un format lossy (OGG dans mon cas) pour économiser de la place.
 
Je souhaite donc me créer un script shell qui scruterai (via une ligne dans CRON) deux répertoires donnés en paramètre, le premier la racine de mes FLAC et le deuxième celle de mes OGG afin de créerait les OGG manquant à l'ajout de nouveaux FLAC.
Pour info mes arborescence sont de ce type :
/mnt/share/music/FLAC/Artiste/Album
/mnt/share/music/OGG/Artiste/Album
 
Mon "NAS" est un Pentium IV recycler avec Debian NetInstall et Samba et mon PC principal est sous Fedora LXDE.
 
J'aimerais approfondir mes connaissances en shell avec se besoin mais je ne sais pas par quoi commencer.
Pour l'instant j'ai juste la commande pour compresser les FLAC en OGG (le plus facile) mais je ne vois pas comment dérouler toute l'arborescence FLAC et encore moins vérifier que les fichiers dans ces répertoires ont leur image en OGG.
De plus je galère pas mal avec les noms de mes répertoires qui peuvent contenir des espaces...
 
Si une bonne âme pourrait me lancer je lui serai reconnaissant.
 
 
Merci

Reply

Marsh Posté le 24-11-2012 à 16:53:38   

Reply

Marsh Posté le 01-12-2012 à 11:43:24    

Finalement je cherchais trop compliqué à base de rsync, find, ...
 
Je me suis limité à ls en fait et voici un premier jet qui "marche" :
 
C'est mon premier script shell donc si vous voyez des horreurs n’hésitez pas à m'en faire part.
 

#!/bin/bash
listfile() {
    #Sauvegarde de L'Internal Field Separator (Utile ???)
    SaveIFS=$IFS
    #Seprateur uniquement au saut de page
    IFS=$'\n'
    #Pour tout les fichiers du répertoire donné en paramètre
    for fichier in $(eval ls \"$1\" ); do
        #Si c'est un fichier
        if [ -f "$1/$fichier" ]; then
            #Si le nom du fichier contient '.flac'
            if [ ${fichier##*.} == 'flac' ]; then
                #Détermination du nom complet du fichier cible
                local fileDest=$(replaceStr "$1/$fichier" "FLAC" "OGG" )
                local fichier_flac=$1/$fichier
                fileDest=$(replaceStr "$fileDest" ".flac" ".ogg" )
                #Recherche si fichier cible existant
                if [ ! -f "$fileDest" ]; then
                    echo "Compression de : "$fileDest
                    #On le compresse
                    oggenc "$fichier_flac" -q9
                    #On le met dans le repertoire OGG
                    fichier_ogg=$(replaceStr "$fichier_flac" ".flac" ".ogg" )
                    mv "$fichier_ogg" "$fileDest"
                fi
            elif [ ${fichier##*.} == 'png' ] || [ ${fichier##*.} == 'jpg' ] || [ ${fichier##*.} == 'nfo' ]; then
                #Détermination du nom complet du fichier cible
                local fileDest=$(replaceStr "$1/$fichier" "FLAC" "OGG" )
                local fileSrc=$1/$fichier
                #Recherche si fichier cible existant
                if [ ! -f "$fileDest" ]; then
                    echo "Copie de : "$fileDest
                    #On copie le fichier
                    mv "$fileSrc" "$fileDest"
                fi
            fi
 
        #Si c'est un répertoire
        elif [ -d "$1/$fichier" ]; then
            local rep=$1/$fichier
            #Détermination du nom du répertoire cible
            local repDest=$(replaceStr "$rep" "FLAC" "OGG" )
            #Si inexitant
            if [ ! -d "$repDest" ]; then
                echo "___KO : "$repDest
                #Création du répertoire
                eval mkdir \"$repDest\"
            fi
            #Appel récursif avec ce nouveau répertoire
            listfile "$rep"
        fi
    done
    #On réapplique le IFS sauvegardé (Utile ???)
    IFS=$SaveIFS
}
 
replaceStr(){
    local cible=$(echo $1 | sed -e "s/$2/$3/" )
    echo $cible
}
 
source=$1
echo $source
 
listfile "$source"


 
Pour ne plus être embête avec les espaces j'ai modifier $IFS, c'est trop grâve ? Ya pas mieux ? La porté de cette modification est-elle restreinte à mon script ou à ton mon shell ? En gros $SaveIFS sert ou pas ?
 
Pour remplacer une sous-chaine de caractère par une autre il n'y a pas mieux que ? :

replaceStr(){
    local cible=$(echo $1 | sed -e "s/$2/$3/" )
    echo $cible
}


 
Comme prochaine amélioration je ne vais pas compresser les fichiers tout de suite mais les mettre dans un fichier pour les compresser tout à la fin.
Ayant une bonne capacité de calcul (core i7), Je voudrais savoir si il y a un moyen de lancer x script sh en même temps, ainsi je pense faire un truc du genre :
Ajouter les fichiers à compresser dans x fichier à tour de rôle et à la fin lancer ces x fichier en parallèle.
Est-ce faisable ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed