Convierta todos los archivos .ape a .flac en diferentes subcarpetas

9

Estaba tratando de convertir algunos archivos .ape a archivos .flac usando la avconvlínea de comandos; obviamente, avconvno es el punto principal aquí; su sintaxis es bastante sencillo, avconv -i inputApeFile.ape outputFlacFile.flac.

El punto es que los archivos están anidados en más subcarpetas; es decir, tengo la carpeta Artist, luego varias subcarpetas de CD, cada una de las cuales contiene diferentes archivos .ape. ¿Cómo puedo convertir todos los archivos y luego guardarlos en la misma carpeta del archivo original pero con la extensión .flac?

Si es posible, me gustaría usar solo el comando de shell en una sola línea sin usar scripts. Creo que debería ser algo así

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

pero estoy atrapado con la segunda parte (¿tal vez usando sed??!?)

tigerjack89
fuente

Respuestas:

13

El comando que necesitas es:

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

Esto encontrará cada archivo que tenga .apesufijo y luego lo convertirá con el mismo nombre de archivo con .flacsufijo en la misma ubicación donde se encuentra el archivo original.

{}es la ruta del archivo encontrado actual.
Mira la prueba desde aquí

αғsнιη
fuente
1

El script (python) a continuación debería hacer el trabajo. Cópielo en un archivo vacío, guárdelo como convert.py, establezca el directorio en los archivos en la sección principal del script ( convert_dir =) y ejecútelo con el comando:

python3 /path/to/convert.py

La secuencia de comandos

#!/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
fuente
gracias por tu respuesta y tu tiempo Jacob. Sin embargo, si es posible, me gustaría usar solo el comando de shell en una sola línea sin usar script (lo siento, tuve que especificar esto antes)
tigerjack89
1
@ tigerjack89 Bueno, tal vez alguien más podría usarlo en situaciones similares; la sintaxis <comando> <inputfile> <outputfile> es bastante común.
Jacob Vlijm el
0

Ahora que se prefiere ffmpeg sobre avconv nuevamente, y hay muchas computadoras centrales baratas ($ 60 por un XU4 de 8 núcleos), creo que lo siguiente es más efectivo;

#!/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 "$@"' _ "{}"
usuario1133275
fuente
-1

un comando de línea que estaba buscando: el
find -type f -name "*.ape" -print0 | xargs -0 avconv -i
findcomando proporcionará solo archivos que terminen en .ape,
el findcomando proporcionará la ruta relativa al avconvcomando para que pueda convertir esos archivos y mantenerlos en la misma carpeta que el archivo de entrada (es decir, .ape).
findEl comando encontrará todos los archivos en ese directorio independientemente de qué tan profundo se guarden en el subdirectorio

Edward Torvalds
fuente
2
Esto no funcionará; avconvno puede tomar archivos de entrada de STDIN así.
evilsoup
1
¿Qué pasa con la carpeta de salida?
tigerjack89
@evilsoup He actualizado la respuesta, xargs puede resolver el problema. Por favor intente esto.
Edward Torvalds