Forum Astuces.divers Ligne de commande : exécuter la commande dans tous les dossiers enfants

Posté par . Licence CC by-sa
Tags :
1
20
sept.
2014

Bonjour,

Les voitures récentes ont pour certaines remplacé le bon vieux lecteur CD pour un port USB pour lire de la musique numérisée. Dans le cas de la Peugeot 208, le système embarqué semble lire (entre autres) le FLAC et l'Ogg Vorbis (apparemment pas l'Opus, mais ce n'est déjà pas si mal). Mon âme de libriste étant toute émoustillée de cette attention, voilà que je prépare des dossiers de musiques issus de ma bibliothèque en FLAC et dégaine le terminal pour les convertir en Ogg à la chaîne.

J'utilise la commande suivante pour décompresser les FLAC en WAV que je convertis de suite en OGG et suprimer les fichiers initiaux :

for f in *.flac ; do flac -d "$f" ; rm "$f" ; done && for f in *.wav ; do oggenc -q 9 "$f" ; rm "$f" ; done

(bon, c'est sans doute pas très beau et ultra-basique mais je ne suis pas un champion du shell…)
La commande est efficace mais n'agit que sur les fichiers du dossier actuel.

Voilà donc ma question : comment faire ne sorte que la commande ci-dessus aille s'exécuter dans tous les dossiers enfants du dossier actuel ?

J'imagine que c'est un truc pas bien compliqué mais je n'ai pas trouvé quoi…

Merci d'avance

HS: Le Ogg c'est bien le format audio avec pertes le plus performant (meilleur ratio qualité audio/poids) actuellement, après Opus, n'est-ce pas ?

  • # remplace for par find, ou couple les

    Posté par . Évalué à 4.

    ainsi tu demandes à find de trouver tous les fichiers .flac, et d'executer l'enchainement de commande.

    par exemple :

    for f in $(find . -type f -iname '*.flac') ; do flac -d "$f" ; rm "$f" ; done && for f in *.wav ; do oggenc -q 9 "$f" ; rm "$f" ; done
    • [^] # Re: remplace for par find, ou couple les

      Posté par . Évalué à 3.

      for f in $(find . -type f -iname '*.flac') ; do flac -d "$f" && rm "$f" ; done && for f in *.wav ; do oggenc -q 9 "$f" && rm "$f" ; done

      En rajoutant des && à la place des ; juste avant les rm, c'est un peu plus sécurisant. Imaginons un fichier .flac que flac n'arrive pas à décoder, dans le premier cas, il aurait été effacé sans sommation. Dans le second, il sera conservé.

  • # Find

    Posté par . Évalué à 1.

    Tu pourrais utiliser la commande find, qui va aller chercher les fichiers dans les sous-dossiers, et la combiner avec xargs qui exécute une commande sur une liste de fichiers.

    en principe ça devrait fonctionner avec ça (mais j'ai pas testé) :

    find . -name *.flac | xargs -I{} flac -d {} && rm {}
    find . -name *.wav | xargs -I{} oggenc -q9 {} && rm {}

    si tu as des soucis avec des espaces dans les nom de fichiers, tu peux utiliser l'option "-print0" pour find, et "-0" pour xargs.

    • [^] # Re: Find

      Posté par . Évalué à 4.

      xargs n'appelle pas la commande dans un shell, il faut le faire explicitement xargs -I{} sh -c "flac -d {} && rm {}"

      Pour des gros calculs comme ça, en ajoutant l'option -P nombre_de_cœur à xargs on parallélise gratuitement le programme.

      Please do not feed the trolls

  • # Yo

    Posté par . Évalué à 7.

    Je vais peut-être dire une connerie mais n'est-ce pas possible de convertir directement les FLAC en Ogg Vorbis, sans passer par un WAV ?

    • [^] # Re: Yo

      Posté par . Évalué à 3.

      Ouais, il vaut mieux utiliser ffmpeg ou avconv :

      find . -type f -iname '*.flac' \
             -exec avconv -i '{}' -strict experimental -acodec vorbis \
                          -aq 9   -ac 2   '{}'.ogg ';' \
             -print -delete \
           | sed -E -n 'h;s/\.\w+$/\0.ogg/;p;g;s/\.\w+$/.ogg/;p' \
           | xargs -r -d '\n' -n 2 mv

      En général, je règle la qualité sur 7, quand je transcode en Vorbis. La qualité maximum est 10, mais je ne crois pas que la différence soit très audible (ou alors, ça dépends du matériel ?).

      Envoyé depuis ma Debian avec Firefox

  • # SoundConverter

    Posté par (page perso) . Évalué à 2.

    Personnellement, j’utilise SoundConverter qui fait bien le boulot.

  • # Plus simplement

    Posté par . Évalué à 2.

    Simplement ceci devrait faire l'affaire. C'est une extension zsh, mais bash la supporte aussi depuis un moment il me semble.

    for f in **/*.flac ; ...

  • # avec find

    Posté par . Évalué à 1.

    find ./ -iname *.flac -exec flac2ogg.sh '{}' ';'
    

    flac2ogg.sh :

    flac -dc ${1} | oggenc -q -o ${1/.flac/.ogg} -

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.