Конвертировать все файлы .ape в .flac в разных подпапках

9

Я пытался преобразовать некоторые файлы .ape в файлы .flac с помощью avconvкомандной строки; очевидно, avconvздесь не главное; его синтаксис довольно прост avconv -i inputApeFile.ape outputFlacFile.flac.

Дело в том, что файлы вложены в несколько подпапок; у меня есть папка Artist, затем различные подпапки CD, каждая из которых содержит разные файлы .ape. Как я могу преобразовать все файлы и затем сохранить их в той же папке исходного файла, но с расширением .flac?

Если это возможно, я бы хотел использовать только команду оболочки в одной строке без использования скриптов. Я думаю, что это должно быть что-то подобное

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

но я застрял со второй частью (возможно, используя sed??!?)

tigerjack89
источник

Ответы:

13

Команда, которая вам нужна:

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

Это позволит найти каждый файл с .apeсуффиксом, а затем преобразовать его с тем же именем файла с .flacсуффиксом в то же место, где находится исходный файл.

{}путь к текущему найденному файлу
Смотрите тест здесь

αғsнιη
источник
1

Скрипт (python) ниже должен сделать эту работу. Скопируйте его в пустой файл, сохраните его как convert.py, установите каталог для файлов в разделе head скрипта ( convert_dir =) и запустите его командой:

python3 /path/to/convert.py

Сценарий

#!/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
Якоб Влейм
источник
спасибо за ваш ответ и ваше время, Джейкоб. Однако, если это возможно, я бы хотел использовать только команду оболочки в одной строке без использования скрипта (извините за это, я должен был указать это раньше)
tigerjack89
1
@ tigerjack89 Ну, может, кто-то другой мог бы использовать его в подобных ситуациях; синтаксис <command> <inputfile> <outputfile> довольно распространен.
Джейкоб Влийм
0

Теперь, когда ffmpeg снова предпочтительнее avconv, и есть много дешевых базовых компьютеров (60 долларов за 8-ядерный XU4), я считаю следующее наиболее эффективным;

#!/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
источник
-1

одна из командной строки Вы искали:
find -type f -name "*.ape" -print0 | xargs -0 avconv -i
findкоманда обеспечит только файлы , оканчивающиеся .ape команда даст относительный путь к команде , так что он может конвертировать эти файлы и сохранить их в той же папке, что и файл ввода (т.е. .ape). Команда найдет все файлы в этом каталоге, независимо от того, насколько глубоко они хранятся в подкаталоге.
findavconv
find

Эдвард Торвальдс
источник
2
Это не сработает; avconvне могу взять входные файлы из STDIN, как это.
evilsoup
1
как насчет выходной папки?
tigerjack89
@evilsoup Я обновил ответ, xargs может решить проблему. пожалуйста, попробуйте это.
Эдвард Торвальдс