Конвертировать все файлы.ape в.flac в разных подпапках
Я пытался преобразовать некоторые файлы.ape в файлы.flac, используя avconv
в командной строке; очевидно, avconv
не главное здесь; его синтаксис довольно прост, avconv -i inputApeFile.ape outputFlacFile.flac
,
Дело в том, что файлы вложены в несколько подпапок; у меня есть папка Artist, затем различные подпапки CD, каждая из которых содержит разные файлы.ape. Как я могу преобразовать все файлы и затем сохранить их в той же папке исходного файла, но с расширением.flac?
Если это возможно, я бы хотел использовать только команду оболочки в одной строке без использования скриптов. Я думаю, что это должно быть что-то подобное
avconv -i 'ls -R | grep ape' '???'
но я застрял со второй частью (возможно, используя sed
??!?)
5 ответов
Команда, которая вам нужна:
find /path/to/MainDir/ -type f -name "*.ape" -execdir sh -c ' avconv -i "$1" "${1%.ape}.flac" ' _ {} \;
Это найдет каждый файл, который имеет .ape
суффикс, а затем преобразовать его с тем же именем файла с .flac
суффикс в том же месте, где находится исходный файл.
{}
путь к текущему найденному файлу
Смотрите тест здесь
Теперь, когда 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 "$@"' _ "{}"
Скрипт (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
Упрощенная версия ответа пользователя1133275, которая выполняется последовательно (и, следовательно, медленнее) и не использует
perl
но использует
xargs -0
чтобы иметь дело с именами файлов, содержащими пробелы, кавычки, круглые скобки, квадратные скобки, трубы и другие специальные символы, которые в противном случае привели бы к сбою сценария при обработке в необработанном виде:
find . -iname '*.ape' -print0 | xargs -0 -I {} ffmpeg -i '{}' '{}.flac'
⚠️ Решение выше ⬆️ имеет тот недостаток, что оригинал
.ape
расширение не удаляется из имени файла, и новые файлы будут иметь.ape.flac
расширение.
Чтобы заменить существующее расширение, можно использовать регулярное выражение bash, поэтому следующая команда создаст файлы с правильным
.flac
расширения:
find . -iname '*.ape' -print0 | xargs -0 -I{} bash -c 'ffmpeg -i "${1}" "${1%.*}.flac"' -- {}
Однострочная команда, которую вы искали:find -type f -name "*.ape" -print0 | xargs -0 avconv -i
find
Команда предоставит только файлы, заканчивающиеся на .apefind
Команда даст относительный путь к avconv
команда, чтобы он мог конвертировать эти файлы и хранить их в той же папке, что и входной файл (т.е. .ape).find
Команда найдет все файлы в этом каталоге, независимо от того, насколько глубоко они хранятся в подкаталоге.