Eu estava tentando converter alguns arquivos .ape em arquivos .flac usando avconv
a linha de comando; obviamente, avconv
nã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 .ape
sufixo e, em seguida, o converterá com o mesmo nome de arquivo com .flac
sufixo 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
find
o comando fornecerá apenas arquivos que terminam com.macaco
o find
comando fornecerá o caminho relativo para avconv
o comando para que ele possa converter esses arquivos e mantê-los na mesma pasta do arquivo de entrada (ou seja, .ape).
find
O comando encontrará todos os arquivos nesse diretório, independentemente da profundidade em que eles são mantidos no subdiretório