Converta todos os arquivos .ape para .flac em diferentes subpastas

Converta todos os arquivos .ape para .flac em diferentes subpastas

Eu estava tentando converter alguns arquivos .ape em arquivos .flac usando avconva linha de comando; obviamente, avconvnão é o ponto principal aqui; sua sintaxe é bastante direta, avconv -i inputApeFile.ape outputFlacFile.flac.

A questão é que os arquivos estão aninhados em mais subpastas; ou seja, eu tenho a pasta Artist e, em seguida, várias subpastas de CD, cada uma contendo arquivos .ape diferentes. Como posso converter todos os arquivos e salvá-los na mesma pasta do arquivo original, mas com a extensão .flac?

Se for possível, gostaria de usar apenas o comando shell em uma única linha, sem usar scripts. acho que deveria ser algo assim

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

mas estou preso na segunda parte (talvez usando sed??!?)

Responder1

O comando que você precisa é:

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

Isso encontrará cada arquivo que possui .apesufixo e, em seguida, o converterá com o mesmo nome de arquivo com .flacsufixo no mesmo local em que o arquivo original está localizado.

{}é o caminho do arquivo encontrado atualmente.
Veja o teste deaqui

Responder2

O script (python) abaixo deve fazer o trabalho. Copie-o para um arquivo vazio, salve-o como convert.py, defina o diretório para os arquivos na seção head do script ( convert_dir =) e execute-o pelo comando:

python3 /path/to/convert.py

O roteiro

#!/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

Responder3

Agora que o ffmpeg é preferido ao avconv novamente, e existem muitos computadores básicos baratos (US $ 60 para um XU4 de 8 núcleos), considero o seguinte o mais eficaz;

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

Responder4

comando de uma linha que você estava procurando:
find -type f -name "*.ape" -print0 | xargs -0 avconv -i
findo comando fornecerá apenas arquivos que terminam com.macaco
o findcomando fornecerá o caminho relativo para avconvo comando para que ele possa converter esses arquivos e mantê-los na mesma pasta do arquivo de entrada (ou seja, .ape).
findO comando encontrará todos os arquivos nesse diretório, independentemente da profundidade em que eles são mantidos no subdiretório

informação relacionada