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

9

Eu estava tentando converter alguns arquivos .ape para arquivos .flac usando avconv na linha de comando; obviamente, avconv não é o ponto principal aqui; sua sintaxe é bem direta, avconv -i inputApeFile.ape outputFlacFile.flac .

O ponto é que os arquivos estão aninhados em mais subpastas; ou seja, eu tenho a pasta Artist, depois várias subpastas de CD, cada uma contém 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. Eu acho que deveria ser algo parecido com isso

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

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

    
por tigerjack89 09.11.2014 / 10:24

4 respostas

13

O comando que você precisa é:

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

Isso localizará cada arquivo que tiver% sufixo .ape e, em seguida, o converterá com o mesmo nome de arquivo com sufixo .flac para o mesmo local em que o arquivo original está localizado.

{} é o caminho do arquivo encontrado atual.
Veja o teste em aqui

    
por αғsнιη 09.11.2014 / 12:40
1

O script (python) abaixo deve fazer o trabalho. Copie-o para um arquivo vazio, salve-o como convert.py , configure 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 script

#!/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
    
por Jacob Vlijm 09.11.2014 / 10:42
0

Agora que o ffmpeg é preferido sobre o avconv novamente, e há muitos computadores centrais baratos (US $ 60 para um XU4 de 8 núcleos), eu considero o seguinte como sendo o mais eficaz;

#!/bin/bash

#
# ape2flac.sh
#

function f2m(){
        FILE=$(echo "" | 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 "$@"' _ "{}"
    
por user1133275 27.03.2018 / 23:39
-1

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

    
por edward torvalds 09.11.2014 / 12:36