![Конвертировать все файлы .ape в .flac в разных подпапках](https://rvso.com/image/1048300/%D0%9A%D0%BE%D0%BD%D0%B2%D0%B5%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B2%D1%81%D0%B5%20%D1%84%D0%B0%D0%B9%D0%BB%D1%8B%20.ape%20%D0%B2%20.flac%20%D0%B2%20%D1%80%D0%B0%D0%B7%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%D0%B4%D0%BF%D0%B0%D0%BF%D0%BA%D0%B0%D1%85.png)
Я пытался преобразовать некоторые файлы .ape в файлы .flac с помощью avconv
командной строки; очевидно, avconv
это не главная суть; синтаксис довольно прост, avconv -i inputApeFile.ape outputFlacFile.flac
.
Дело в том, что файлы вложены в большее количество подпапок; т. е. у меня есть папка Artist, затем различные подпапки CD, каждая из которых содержит разные файлы .ape. Как мне конвертировать все файлы, а затем сохранить их в той же папке исходного файла, но с расширением .flac?
Если это возможно, я бы хотел использовать только команду shell в одной строке без использования скриптов. Я думаю, что это должно быть что-то вроде этого
avconv -i 'ls -R | grep ape' '???'
но я застрял со второй частью (может быть, используя sed
??!?)
решение1
Команда, которая вам нужна:
find /path/to/MainDir/ -type f -name "*.ape" -execdir sh -c ' avconv -i "$1" "${1%.ape}.flac" ' _ {} \;
Это позволит найти каждый файл, имеющий .ape
суффикс, а затем преобразовать его в тот же файл с тем же именем и .flac
суффиксом в то же место, где находится исходный файл.
{}
это путь к текущему найденному файлу.
Смотрите тест отздесь
решение2
Скрипт (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
решение3
Теперь, когда 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 "$@"' _ "{}"
решение4
однострочная команда, которую вы искали:
find -type f -name "*.ape" -print0 | xargs -0 avconv -i
find
команда выведет только файлы, заканчивающиеся на.обезьяна
команда find
укажет относительный путь к avconv
команде, чтобы она могла преобразовать эти файлы и сохранить их в той же папке, что и входной файл (т.е. .ape).
find
команда найдет все файлы в этом каталоге независимо от того, насколько глубоко они хранятся в подкаталоге.