web-dev-qa-db-fra.com

Convertir tous les fichiers .ape en .flac dans différents sous-dossiers

J'essayais de convertir certains fichiers .ape en fichiers .flac en utilisant avconv en ligne de commande; évidemment, avconv n'est pas le point principal ici; sa syntaxe est assez simple, avconv -i inputApeFile.ape outputFlacFile.flac.

Le fait est que les fichiers sont imbriqués dans plusieurs sous-dossiers; c’est-à-dire que j’ai le dossier Artist, puis divers sous-dossiers de CD, chacun contenant des fichiers .ape différents. Comment convertir tous les fichiers, puis les sauvegarder dans le même dossier que le fichier d'origine, mais avec l'extension .flac?

Si cela est possible, j'aimerais utiliser uniquement la commande Shell sur une seule ligne sans utiliser de scripts. Je pense que ça devrait être quelque chose comme ça

avconv -i 'ls -R | grep ape' '???'

mais je suis coincé avec la deuxième partie (peut-être en utilisant sed ??!??)

9
tigerjack89

La commande dont vous avez besoin est:

find /path/to/MainDir/ -type f -name "*.ape"  -execdir sh -c ' avconv -i "$1" "${1%.ape}.flac" ' _ {} \;

Cela trouvera chaque fichier portant le suffixe .ape, puis le convertira avec le même nom de fichier avec le suffixe .flac au même emplacement que le fichier d'origine.

{} est le chemin du fichier trouvé actuel.
Voir le test de ici

13
αғsнιη

Le script (python) ci-dessous devrait faire l'affaire. Copiez-le dans un fichier vide, enregistrez-le sous convert.py, définissez le répertoire sur les fichiers de la section d'en-tête du script (convert_dir =) et exécutez-le à l'aide de la commande suivante:

python3 /path/to/convert.py

Le scénario

#!/usr/bin/env python3

convert_dir = "/path/to/folder/tobeconverted"

import os
import subprocess

for root, dirs, files in os.walk(convert_dir):
    for name in files:
        if name.endswith(".ape"):
            # filepath+name
            file = root+"/"+name
            # to use in other (convert) commands: replace the "avconv -i" by your command, and;
            # replace (".ape", ".flac") by the input / output extensions of your conversion
            command = "avconv -i"+" "+file+" "+file.replace(".ape", ".flac")
            subprocess.Popen(["/bin/bash", "-c", command])
        else:
            pass
1
Jacob Vlijm

Maintenant que ffmpeg est à nouveau préféré à avconv, et qu’il existe de nombreux ordinateurs centraux peu coûteux (60 $ pour un XU4 à 8 cœurs), j’utilise ce qui suit pour être plus efficace;

#!/bin/bash

#
# ape2flac.sh
#

function f2m(){
        FILE=$(echo "$1" | Perl -p -e 's/.ape$//g');
        if [ ! -f "$FILE".flac ] ; then
                ffmpeg -v quiet -i "$FILE.ape" "$FILE.flac"
        fi
}
export -f f2m
find "$FOLDER" -name '*.ape' | xargs -I {} -P $(nproc) bash -c 'f2m "$@"' _ "{}"
0
user1133275