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 07/09/2013, à 01:08

compte supprimé

Mon script ignore des dossiers...

Hello ! big_smile

J'ai téléchargé il y a quelques heures de la musique en FLAC (plusieurs albums, sur Qobuz pour ceux qui connaissent), et je voudrais encoder tout ça en Ogg Vorbis pour mon téléphone (assez de mémoire, mais la lecture des FLAC y est saccadée). J'ai écrit un petit script pour ça.

Toute ma musique est présente dans mon dossier ~/Musique, organisé classiquement par dossiers, Artiste/Album/Pistes. Je cherche à créer un autre dossier à l'arborescence identique, avec les mêmes fichiers réencodés. Mon script se lance à la racine du dossier ~/Musique.
Le voici :

#!/usr/bin/env bash

out=oggs
if [ ! -d $out ]; then
    mkdir $out
fi

for d in *; do
    if [ -d "$d" ] && [ "$d" != "$out" ]; then
        cp -r "$d" "$out/"
        cd "$out/$d"
        for da in *; do
            if [ -d "$da" ]; then
                cd "$da"
                for f in *.flac; do
                    oggenc "$f" -q 9 && rm "$f"
                done
            fi
            cd ..
        done
   fi
   cd ..
done

Je crée donc un dossier "oggs" à la racine, puis j'y copie chaque dossier d'artiste avant de parcourir les albums qui s'y trouvent et de convertir les fichiers (en supprimant les FLAC).

Problème : le script traite correctement les deux premiers dossiers, puis ignore tous les suivants, sans raison apparente. Avec quelques instructions d'affichage, je me suis rendu compte que seuls ces deux dossiers passent le test de la ligne 9 (le if qui vérifie si c'est bien un dossier et que ce n'est pas le dossier oggs cible). Seul le dossier oggs vérifie la première condition (mais pas la deuxième), les autres n'en vérifient aucune (pourtant ce sont bien des dossiers ! yikes ).

Je n'y comprends rien, en plus avec une petite modification du script (me souviens plus laquelle), certains dossiers passaient la première, mais toujours pas la deuxième. Tout le problème semble donc venir de cette ligne if, qui se comporte aléatoirement.

Qu'est-ce que j'ai fait ? yikes

#2 Le 07/09/2013, à 03:10

lukophron

Re : Mon script ignore des dossiers...

Salut,

Ton script se paume dans l'arborescence.
Une idée serait de faire

for d in *; do
    ...
    for da in $d/*; do
        ...
        for f in $d/$da/*.flac; do
            ...

et vire les "cd .." qui ne servent à rien et sont mal placés.

Au passage, tu peux voir que cette triple boucle imbriquée, ce n'est peut-être pas la meilleure solution ^^

Dernière modification par lukophron (Le 07/09/2013, à 03:17)


Le danger avec les glands est qu'ils prennent racines.
Corneille

Hors ligne

#3 Le 07/09/2013, à 03:38

nesthib

Re : Mon script ignore des dossiers...

Le script suivant convertit tous les FLAC en OGG et les place dans Musique-ogg (non testé).

while read fichier
do
  OUT="${fichier/Musique/Musique-ogg}"
  mkdir --parents "${OUT%/*}"
  oggenc -q 9 -o "$OUT" "$fichier"
done < <(find ~/Musique -iname '*.flac')

GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#4 Le 07/09/2013, à 10:18

Postmortem

Re : Mon script ignore des dossiers...

Salut,
@Sga64 :
Par rapport à ton script, je dirais que tes cd .. sont mals placés.
Il faut les mettre dans les if où tu fais les cd.
En clair ceci :

        for da in *; do
            if [ -d "$da" ]; then
                cd "$da"
                for f in *.flac; do
                    oggenc "$f" -q 9 && rm "$f"
                done
            fi
            cd ..

Devrait être :

        for da in *; do
            if [ -d "$da" ]; then
                cd "$da"
                for f in *.flac; do
                    oggenc "$f" -q 9 && rm "$f"
                done
                cd ..
            fi

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#5 Le 07/09/2013, à 11:31

compte supprimé

Re : Mon script ignore des dossiers...

Merci à tous big_smile Effectivement le problème venait des cd mal placés - quand le script tombait sur lui-même, il s'ignorait mais remontait quand même d'un niveau, et se retrouvait dans mon home.

J'ai viré les cd, mais j'ai dû en garder un parce que le joker dans "$outd"/"$d"/"$da"/*.flac ne fonctionnait pas (le script cherchait un seul fichier "*.flac").

Voici donc le script corrigé :

#!/usr/bin/env bash

quality=9
outd='.oggs'
if [ ! -d $outd ]; then
    mkdir $outd
fi

for d in *; do
    if [ -d "$d" ] && [ "$d" != "$out" ]; then
        cp -r "$d" "$outd/"
        for da in "$outd"/"$d"/*; do
            echo "$da"
            if [ -d "$da" ]; then
                cd "$da"
                for f in *.flac; do
                    oggenc "$f" -q $quality && rm "$f"
                done
                cd ../../..
            fi
        done
    fi
done

Il fonctionne maintenant, mais si quelqu'un a une idée pour remplacer le cd "$da" en utilisant un joker, je le remercie.

#6 Le 07/09/2013, à 17:53

nesthib

Re : Mon script ignore des dossiers...

Tu as regardé ma solution ? Parce que là tu t'embêtes pour pas grand chose tongue


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#7 Le 07/09/2013, à 18:05

Haleth

Re : Mon script ignore des dossiers...

Tu veux conserver l'original dans une autre arborescence, ou pas ?

Pourquoi ne pas faire un truc comme ca:

cp -R source dest
find dest -type f -exec oggenc {} -q 9  \; -delete

Ubuntu is an ancien African word which means "I can't configure Debian"

Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.

Hors ligne

#8 Le 08/09/2013, à 10:28

Postmortem

Re : Mon script ignore des dossiers...

Salut,

Sga64 a écrit :

Il fonctionne maintenant, mais si quelqu'un a une idée pour remplacer le cd "$da" en utilisant un joker, je le remercie.

Ça ne fonctionne pas si tu fais "$outd"/"$d"/"$da"/*.flac car dans la variable $da, il y a déjà la partie "$outd"/"$d".
Il faut donc juste faire for f in "$da"/*.flac


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#9 Le 02/10/2013, à 15:40

compte supprimé

Re : Mon script ignore des dossiers...

Bon, merci à tous pour vos réponses, effectivement avec la correction de Postmortem le script fonctionne parfaitement, et la solution de Haleth montre que je me suis pris la tête pour rien (sais pas me servir correctement de find big_smile ). Je quitte le forum pour l'instant mais je vous remercie tous pour votre aide smile

@+ wink