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

9

Eu estava tentando converter alguns arquivos .ape em arquivos .flac usando avconvna linha de comando; obviamente, avconvnã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, tenho a pasta Artista e 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 possível, eu gostaria de usar apenas o comando shell em uma única linha sem usar scripts. Eu acho que deveria ser algo assim

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

mas eu estou preso com a segunda parte (talvez usando sed??!?)

tigerjack89
fonte

Respostas:

13

O comando que você precisa é:

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

Ele localizará cada arquivo que possui .apesufixo e depois o converterá com o mesmo nome de arquivo com o .flacsufixo no mesmo local em que o arquivo original está localizado.

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

αғsнιη
fonte
1

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 principal 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
Jacob Vlijm
fonte
obrigado pela sua resposta e seu tempo Jacob. No entanto, se for possível, eu gostaria de usar comando só shell em uma única linha sem o uso de script (desculpe por isso, eu tive que especificar isso antes)
tigerjack89
11
@ tigerjack89 Bem, talvez alguém possa usá-lo em situações semelhantes; a sintaxe <comando> <inputfile> <outputfile> é bastante comum.
Jacob Vlijm
0

Agora que o ffmpeg é preferido em vez do avconv novamente, e existem muitos computadores de baixo custo (US $ 60 para um XU4 de 8 núcleos), sugiro o seguinte para ser 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 "$@"' _ "{}"
user1133275
fonte
-1

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

Edward Torvalds
fonte
2
Isso não vai funcionar; avconvnão pode receber arquivos de entrada do STDIN assim.
precisa saber é o seguinte
11
e a pasta de saída?
tigerjack89
@evilsoup Atualizei a resposta, o xargs pode resolver o problema. por favor tente isso.
Edward Torvalds