MP4 в MKV
Скрипт конвертирует MP4 в MKV без потери качества. Используется ffmpeg.
#!/usr/bin/env bash # 1. Проверяем наличие ffmpeg if ! command -v ffmpeg &> /dev/null; then echo "❌ Ошибка: ffmpeg не установлен." echo " Ubuntu/Debian: sudo apt install ffmpeg" echo " Fedora/RHEL: sudo dnf install ffmpeg" exit 1 fi # 2. Проверяем аргументы if [ $# -eq 0 ]; then echo "📖 Использование: $0 <маска_файлов> [папка_результата]" echo " Пример 1: $0 '*.mp4'" echo " Пример 2: $0 '*.mp4' './converted_mkv'" exit 1 fi input_mask="$1" output_dir="${2:-}" # 3. Подготовка папки результата (если указана) if [ -n "$output_dir" ]; then # Убираем слеш в конце для единообразия output_dir="${output_dir%/}" if ! mkdir -p "$output_dir" 2>/dev/null; then echo "❌ Ошибка: не удалось создать или получить доступ к папке '$output_dir'" exit 1 fi fi # 4. Раскрытие маски файлов shopt -s nullglob files=($input_mask) shopt -u nullglob if [ ${#files[@]} -eq 0 ]; then echo "⚠️ Файлы по маске '$input_mask' не найдены." exit 0 fi # 5. Информация перед стартом echo "📁 Найдено файлов: ${#files[@]}" if [ -n "$output_dir" ]; then echo "📂 Папка результата: $output_dir" else echo "📂 Папка результата: [та же, что и у исходных файлов]" fi echo "🚀 Начинаю конвертацию..." echo "----------------------------------------" success=0 fail=0 # 6. Основной цикл for file in "${files[@]}"; do [ -f "$file" ] || continue # Извлекаем имя файла без расширения base_name="$(basename "$file")" name_no_ext="${base_name%.*}" # Формируем путь результата if [ -n "$output_dir" ]; then outfile="${output_dir}/${name_no_ext}.mkv" else outfile="${file%.*}.mkv" fi # Защита от перезаписи (если по какой-то причине пути совпали) if [ "$(realpath "$file" 2>/dev/null)" = "$(realpath "$outfile" 2>/dev/null)" ]; then echo "⚠️ Пропуск: $file (путь результата совпадает с исходным)" continue fi echo ">> $file -> $outfile" # Конвертация: -c copy = стрим-копирование без перекодирования if ffmpeg -i "$file" -c copy "$outfile" -y -loglevel error; then echo " ✅ Успешно" ((success++)) else echo " ❌ Ошибка конвертации" ((fail++)) fi done echo "----------------------------------------" echo "🏁 Готово! Успешно: $success, Ошибок: $fail"
Примеры:
# 1. Складывать рядом с исходными файлами (как раньше) ./mp4_to_mkv.sh "*.mp4" # 2. Складывать в конкретную папку (создастся автоматически) ./mp4_to_mkv.sh "videos/*.mp4" "./mkv_output" # 3. С абсолютным путём ./mp4_to_mkv.sh "/home/user/clip*.mp4" "/tmp/converted"
Важно про кавычки: Маску файлов (*.mp4) всегда передавайте в одинарных или двойных кавычках. Иначе оболочка раскроет её до запуска скрипта, и при отсутствии файлов в текущей директории скрипт получит литеральную строку *.mp4, что сломает логику поиска в других папках.