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


9

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

Справа в тому, що файли вкладені в більше підпапок; тобто у мене є папка виконавця, потім різні підпапки CD, кожна з яких містить різні файли .ape. Як я можу конвертувати всі файли, а потім зберегти їх у тій же папці вихідного файлу, але з розширенням .flac?

Якщо це можливо, я б хотів використовувати лише команду оболонки в одному рядку без використання скриптів. Я думаю, що має бути щось подібне

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

але я застряг з другою частиною (можливо, використовуючи sed??!?)

Відповіді:


13

Вам потрібна команда:

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

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

{}- шлях поточного знайденого файлу.
Дивіться тест тут


1

Сценарій (python) нижче повинен виконати цю роботу. Скопіюйте його в порожній файл, збережіть як convert.py, встановіть каталог у файли в головному розділі скрипту ( 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 Ну, може, хтось із els міг би використати це у подібних ситуаціях; синтаксис <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 "$@"' _ "{}"

-1

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


2
Це не спрацює; avconvне може приймати вхідні файли з STDIN так.
evilsoup

1
як щодо вихідної папки?
tigerjack89

@evilsoup Я оновив відповідь, xargs може вирішити проблему. будь ласка, спробуйте це.
Едвард Торвальдс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.