
Я пытаюсь скопировать большой архив видео (расположенных во вложенных папках) в параллельную структуру папок, одновременно конвертируя видео из mov в mp4 (плюс некоторые другие настройки). Вот команда:
for f in Users/me/VIDEOARCHIVE/*/*.mov; do ffmpeg -i "$f" "Users/me/CONVERTED/${f%.mov}.mp4"; done
Однако я получаю "нет такого файла или каталога" для выходного файла. Я знаю, что на этом сайте есть много похожих вопросов, но ни один из них не помог в моем сценарии.
Я также пробовал заранее создать пустую структуру папок, чтобы пришлось создавать только файл .mp4, но все равно получаю ту же ошибку.
Это работает, когда (пустая) структура папок уже создана заранее. Но как только появляется папка, которая отсутствует, я получаю "нет такого файла или каталога".
Есть ли способ заставить его создавать родительские папки, если это необходимо, чтобы можно было помещать в них файлы?
решение1
Есть ли способ заставить его создавать родительские папки, если это необходимо, чтобы можно было помещать в них файлы?
ffmpeg? Нет. Он не будет создавать папки сам по себе. На самом деле, очень немногие программы делают это.
Некоторые предложения:
- Папку следует создать заранее.
- Вам необходимо использовать базовое имя файла, так как оно
$f
уже содержит полный путь к файлу. - Вам следует использовать рекурсивную подстановку для вашего видеоархива (
**/*
), чтобы обойти все каталоги.
Собираем это вместе:
# enable recursive globbing
shopt -s globstar
# create the directory if necessary
dir="/Users/me/CONVERTED/"
mkdir -p "$dir"
# iterate over all files
for f in /Users/me/VIDEOARCHIVE/**/*.mov; do
# get the file's basename
fname="$(basename "$f")"
# run the command, replacing the file extension
ffmpeg -i "$f" "$dir/${fname%.mov}.mp4"
done