Konwertuj wszystkie pliki .ape na .flac w różnych podfolderach

9

Próbowałem przekonwertować niektóre pliki .ape na pliki .flac przy użyciu avconvwiersza polecenia; oczywiście avconvnie jest tutaj głównym celem; Jego składnia jest bardzo proste, avconv -i inputApeFile.ape outputFlacFile.flac.

Chodzi o to, że pliki są zagnieżdżone w większej liczbie podfolderów; tzn. mam folder Artist, a następnie różne podfoldery CD, z których każdy zawiera różne pliki .ape. Jak przekonwertować wszystkie pliki, a następnie zapisać je w tym samym folderze oryginalnego pliku, ale z rozszerzeniem .flac?

Jeśli to możliwe, chciałbym używać tylko polecenia powłoki w jednym wierszu bez użycia skryptów. Myślę, że tak powinno być

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

ale utknąłem z drugą częścią (może używając sed??!?)

tigerjack89
źródło

Odpowiedzi:

13

Polecenie, którego potrzebujesz to:

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

Znajduje każdy plik z .apesufiksem, a następnie konwertuje go z tą samą nazwą pliku z .flacsufiksem do tej samej lokalizacji, w jakiej znajduje się oryginalny plik.

{}to ścieżka do aktualnie znalezionego pliku.
Zobacz test stąd

αғsнιη
źródło
1

Poniższy skrypt (python) powinien wykonać zadanie. Skopiuj go do pustego pliku, zapisz jako convert.py, ustaw katalog na pliki w sekcji head skryptu ( convert_dir =) i uruchom go za pomocą polecenia:

python3 /path/to/convert.py

Scenariusz

#!/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
źródło
dzięki za odpowiedź i poświęcony czas, Jakubie. Jeśli jednak jest to możliwe, chciałbym użyć tylko polecenia powłoki w jednym wierszu bez użycia skryptu (przepraszam, musiałem to
sprecyzować
1
@ tigerjack89 Cóż, może ktoś mógłby użyć go w podobnych sytuacjach; składnia <polecenie> <plik wejściowy> <plik wyjściowy> jest dość powszechna.
Jacob Vlijm
0

Teraz, gdy ffmpeg jest znów preferowany niż avconv, i istnieje wiele tanich komputerów (60 USD za 8 rdzeni XU4), uważam, że najskuteczniejsze są następujące;

#!/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 "$@"' _ "{}"
użytkownik1133275
źródło
-1

jeden wiersz poleceń szukałeś:
find -type f -name "*.ape" -print0 | xargs -0 avconv -i
findpolecenia zapewni tylko pliki kończąc .ape komenda daje względną ścieżkę do polecenia tak, że można go przekonwertować te pliki i przechowywać je w tym samym folderze co plik wejściowy (tj .ape). polecenie znajdzie wszystkie pliki w tym katalogu, niezależnie od tego, jak głęboko są przechowywane w podkatalogu
findavconv
find

Edward Torvalds
źródło
2
To nie zadziała; avconvnie można pobrać plików wejściowych z STDIN w ten sposób.
evilsoup
1
co z folderem wyjściowym?
tigerjack89
@evilsoup Zaktualizowałem odpowiedź, xargs może rozwiązać problem. spróbuj tego.
Edward Torvalds