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

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

Estaba intentando convertir algunos archivos .ape a archivos .flac usando avconvla línea de comando; Obviamente, avconvno es el punto principal aquí; su sintaxis es bastante sencilla avconv -i inputApeFile.ape outputFlacFile.flac.

La cuestión es que los archivos están anidados en más subcarpetas; es decir, tengo la carpeta Artista, luego varias subcarpetas del 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 Shell en una sola línea sin usar scripts. creo que debería ser algo así

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

pero estoy atascado con la segunda parte (¿quizás usando sed??!?)

Respuesta1

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 a la misma ubicación donde se encuentra el archivo original.

{}es la ruta del archivo encontrado actualmente.
Ver la prueba deaquí

Respuesta2

El siguiente script (python) debería hacer el trabajo. Cópielo en un archivo vacío, guárdelo como convert.py, configure el directorio para 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

Respuesta3

Ahora que nuevamente se prefiere ffmpeg a avconv, y hay computadoras con muchos núcleos baratas ($ 60 por una XU4 de 8 núcleos), considero 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 "$@"' _ "{}"

Respuesta4

comando de una línea que estaba buscando:
find -type f -name "*.ape" -print0 | xargs -0 avconv -i
findel comando proporcionará solo archivos que terminen en.mono
el findcomando proporcionará la ruta relativa al avconvcomando para que pueda convertir esos archivos y guardarlos 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 mantengan en el subdirectorio.

información relacionada