IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Synchronisation arborescence sonothèque


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 4
    Par défaut Synchronisation arborescence sonothèque
    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) un répertoire donné en paramètre (la source de mes FLAC) et ira scruté le dossier OGG afin de créerait les OGG manquant à l'ajout de nouveaux FLAC.
    Les arborescence sont de ce type :
    /mnt/share/music/FLAC/Artiste/Album
    /mnt/share/music/OGG/Artiste/Album

    Pour info, mon "NAS" est un Pentium IV recycler avec Debian NetInstall et Samba et mon PC principal (Core i7) est sous Fedora LXDE.

    J'aimerais approfondir mes connaissances en shell avec se besoin et voici un premier jet "qui marche" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #!/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##*.} == 'txt' ]; 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"
    C'est un premier jet écrit lors d'une codding night (oui j'ai galéré pour si peu) donc pas très beau mais voyez-vous des horreurs à me faire corriger ?

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Bonjour,

    sur une même ligne, utiliser eval et ls, dans une boucle for, c'en est trop, et je n'irai pas plus loin !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for f in "$1"/*; do ...; done
    ! ! !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 4
    Par défaut
    J'en prend bonne note, c'est un reliquat de mes soucis avec les espaces dans les noms de fichier et répertoires avant que je trouve $IFS.

  4. #4
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Par défaut
    Salut,

    Citation Envoyé par NaMoUr
    Je souhaite donc me créer un script shell qui scruterai (via une ligne dans CRON) un répertoire donné en paramètre (la source de mes FLAC) et ira scruté le dossier OGG afin de créerait les OGG manquant à l'ajout de nouveaux FLAC.
    Incron serait pas mal pour cela à mon avis.

    J'utilise pour créer des md5 de fichiers vidéos. C'est très pratique.
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 4
    Par défaut
    Citation Envoyé par Winnt Voir le message
    Incron serait pas mal pour cela à mon avis.
    Merci pour l'outil, ça me convient tout à fait et ça ne parcourt pas toute mon arborescence.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Bonjour.

    Je n'ai pas grand-chose à redire (qui n'ait déjà été dit (sinon ce serait de la redite))!

    En général, j'aime bien que mon code soit bien factorisé (ça facilite la maintenance, entre autres). Ici, je trouve qu'il y a un peu trop d'occurrences de "$1/fichier". Tu aurais pu "remonter de quelques crans" les affectations de cette valeur à une variable (par exemple, déplacer la ligne 15 en 13, voire en 11, voire en 9) et utiliser cette variable là où sa valeur apparaît.

    Cela dit, si tu utilises la proposition de N_BaH for f in "$1"/*; do ...; done (avec laquelle je suis parfaitement en accord), ma remarque tombe, car tu as directement dans $f soit le fichier_flac, soit le fichierSrc, soit le rep.

    Minuscule remarque: j'imagine bien que tu n'as pas l'intention de faire du code industrialisé avec plan de nommage, etc. mais je trouve que le nom fichier_flac (avec un underscore) n'est pas cohérent avec le nom des autres variables (avec des majuscules au début des sous-mots). Évidemment, ça ne changera pas grand-chose au fonctionnement du script!!!

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2012
    Messages : 4
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Minuscule remarque: j'imagine bien que tu n'as pas l'intention de faire du code industrialisé avec plan de nommage, etc. mais je trouve que le nom fichier_flac (avec un underscore) n'est pas cohérent avec le nom des autres variables (avec des majuscules au début des sous-mots). Évidemment, ça ne changera pas grand-chose au fonctionnement du script!!!
    Toute remarque est bonne à prendre, j'ai utilisé la proposition de N_BaH, je vais essayé d'épurer un peu le code et de resté cohérent sur le nom de variable et je le rediffuserai.

Discussions similaires

  1. Sharepoint, One Note, arborescence, synchronisation impossible
    Par Invité dans le forum Configuration
    Réponses: 0
    Dernier message: 25/05/2010, 13h40
  2. Recuperation Arborescence
    Par ramseb dans le forum HyperFileSQL
    Réponses: 6
    Dernier message: 16/06/2003, 09h52
  3. [VB6] parcourir une arborescence de repertoire
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 30/04/2003, 17h33
  4. créer une arborescence windows sous forme d'arbre java
    Par chupachoc dans le forum Composants
    Réponses: 3
    Dernier message: 01/10/2002, 16h48
  5. arbre de parcour d'arborescence windows
    Par chupachoc dans le forum Composants
    Réponses: 7
    Dernier message: 09/09/2002, 08h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo