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

9

J'essayais de convertir certains fichiers .ape en fichiers .flac à l'aide avconvde la ligne de commande; évidemment, ce avconvn'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 plus de sous-dossiers; c'est-à-dire que j'ai le dossier Artist, puis divers sous-dossiers CD, chacun contenant des fichiers .ape différents. Comment puis-je convertir tous les fichiers puis les enregistrer dans le même dossier que le fichier d'origine mais avec l'extension .flac?

Si c'est possible, je voudrais 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??!?)

tigerjack89
la source

Réponses:

13

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 ayant le .apesuffixe, puis le convertira avec le même nom de fichier avec .flacsuffixe au même emplacement que le fichier d'origine.

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

αғsнιη
la source
1

Le script (python) ci-dessous devrait faire le travail. Copiez-le dans un fichier vide, enregistrez-le sous convert.py, définissez le répertoire sur les fichiers dans la section head du script ( convert_dir =) et exécutez-le avec la commande:

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
Jacob Vlijm
la source
merci pour votre réponse et votre temps Jacob. Cependant, si cela est possible, je voudrais utiliser uniquement la commande shell sur une seule ligne sans utiliser de script (désolé pour cela, j'ai dû le
préciser
1
@ tigerjack89 Eh bien, peut-être que quelqu'un d'autre pourrait l'utiliser dans des situations similaires; la syntaxe <command> <inputfile> <outputfile> est assez courante.
Jacob Vlijm
0

Maintenant que ffmpeg est de nouveau préféré à avconv, et qu'il existe de nombreux ordinateurs de base bon marché (60 $ pour un XU4 à 8 cœurs), je trouve que les suivants sont les plus efficaces;

#!/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 "$@"' _ "{}"
user1133275
la source
-1

une ligne de commande que vous cherchiez: la
find -type f -name "*.ape" -print0 | xargs -0 avconv -i
findcommande ne fournira que les fichiers se terminant par .ape
la findcommande donnera le chemin relatif à la avconvcommande afin qu'elle puisse convertir ces fichiers et les conserver dans le même dossier que le fichier d'entrée (ie .ape).
findLa commande trouvera tous les fichiers dans ce répertoire, quelle que soit leur profondeur dans le sous-répertoire

Edward Torvalds
la source
2
Cela ne fonctionnera pas; avconvne peut pas prendre des fichiers d'entrée de STDIN comme ça.
evilsoup
1
qu'en est-il du dossier de sortie?
tigerjack89
@evilsoup J'ai mis à jour la réponse, xargs peut résoudre le problème. veuillez essayer ceci.
Edward Torvalds