Converti tutti i file .ape in .flac in diverse sottocartelle


9

Stavo cercando di convertire alcuni file .ape in file .flac usando avconvdalla riga di comando; ovviamente, avconvnon è il punto principale qui; la sua sintassi è piuttosto semplice, avconv -i inputApeFile.ape outputFlacFile.flac.

Il punto è che i file sono nidificati in più sottocartelle; cioè, ho la cartella Artist, quindi varie sottocartelle CD, ognuna contenente file .ape diversi. Come posso convertire tutti i file e poi salvarli nella stessa cartella del file originale ma con l'estensione .flac?

Se è possibile, mi piacerebbe usare solo il comando shell su una singola riga senza usare gli script. Penso che dovrebbe essere qualcosa del genere

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

ma sono bloccato con la seconda parte (forse usando sed??!?)

Risposte:


13

Il comando che ti serve è:

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

Questo troverà ogni file con .apesuffisso e poi lo convertirà con lo stesso nome file con .flacsuffisso nella stessa posizione in cui si trova il file originale.

{}è il percorso del file trovato corrente.
Vedi il test da qui


1

Lo script (python) qui sotto dovrebbe fare il lavoro. Copiarlo in un file vuoto, salvarlo come convert.py, impostare la directory sui file nella sezione head dello script ( convert_dir =) ed eseguirlo con il comando:

python3 /path/to/convert.py

Il copione

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

grazie per la tua risposta e il tuo tempo Jacob. Tuttavia, se è possibile, mi piacerebbe usare solo il comando shell su una singola riga senza usare lo script (mi dispiace, prima
dovevo specificarlo

1
@ tigerjack89 Beh, forse qualcuno potrebbe usarlo in situazioni simili; la sintassi <comando> <inputfile> <outputfile> è piuttosto comune.
Jacob Vlijm,

0

Ora che ffmpeg è di nuovo preferito su avconv, e ci sono molti computer core economici ($ 60 per un XU4 a 8 core), trovo quanto segue più efficace;

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

-1

un comando di linea che stavi cercando:
find -type f -name "*.ape" -print0 | xargs -0 avconv -i
findcomando fornirà solo i file che terminano con .ape
il findcomando fornirà il relativo percorso al avconvcomando in modo che possa convertire quei file e tenerli nella stessa cartella del file di input (cioè .ape).
findIl comando troverà tutti i file in quella directory indipendentemente dalla profondità con cui sono mantenuti nella sottodirectory


2
Questo non funzionerà; avconvnon è possibile prendere file di input da STDIN in questo modo.
evilsoup,

1
che dire della cartella di output?
tigerjack89,

@evilsoup Ho aggiornato la risposta, xargs può risolvere il problema. per favore prova questo.
Edward Torvalds,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.