![Convierta todos los archivos .ape a .flac en diferentes subcarpetas](https://rvso.com/image/1048300/Convierta%20todos%20los%20archivos%20.ape%20a%20.flac%20en%20diferentes%20subcarpetas.png)
Estaba intentando convertir algunos archivos .ape a archivos .flac usando avconv
la línea de comando; Obviamente, avconv
no 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 .ape
sufijo y luego lo convertirá con el mismo nombre de archivo con .flac
sufijo 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
find
el comando proporcionará solo archivos que terminen en.mono
el find
comando proporcionará la ruta relativa al avconv
comando para que pueda convertir esos archivos y guardarlos en la misma carpeta que el archivo de entrada (es decir, .ape).
find
El comando encontrará todos los archivos en ese directorio, independientemente de qué tan profundo se mantengan en el subdirectorio.