【问题标题】:Print results at conclusion of bash 'for loop'在 bash 'for loop' 结束时打印结果
【发布时间】:2016-10-04 04:43:37
【问题描述】:

我是初学者。 我有一个 Bash 脚本,可以将字幕嵌入到 mkv 文件中(如果它们存在于目录中)。

for i in *.mkv; do
    if [ -f "${i%mkv}"*"srt" ]; then
        ffmpeg -i "$i" -f srt -i "${i%mkv}"*"srt" -map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy -c:s srt $i.output.mkv
        mv "${i%mkv}"*"srt" "${i%mkv}srt".old
        mv $i $i.old
        mv $i.output.mkv $i
    else
        echo $i "does not have srt file"
    fi
done

它会查找所有具有关联 .srt 文件的 .mkv 文件,并对它执行一些 ffmpeg 魔法。如果它没有找到关联的 .srt 文件,则表示 .mkv 文件“没有 srt 文件”。

我怎样才能做到这一点,以便在 for 循环结束时打印出所有具有 .srt 文件并成功执行所有其他操作的 .mkv 文件?

谢谢。

【问题讨论】:

    标签: bash unix for-loop ffmpeg


    【解决方案1】:

    让我们使用Bash array 来存储已完成或已跳过的 MKV:

    SUCCESSMKVS=()
    SKIPMKVS=()
    
    for i in *.mkv; do
        if [ -f "${i%mkv}"*"srt" ]; then
            ffmpeg -i "$i" -f srt -i "${i%mkv}"*"srt" -map 0:0 -map 0:1 \
                -map 1:0 -c:v copy -c:a copy -c:s srt "${i}.output.mkv"
            mv "${i%mkv}"*"srt" "${i%mkv}srt".old
            mv "$i" "${i}.old"
            mv "${i}.output.mkv" "$i"
            SUCCESSMKVS+=("$i")
        else
            echo $i "does not have srt file"
            SKIPMKVS+=("$i")
        fi
    done
    
    echo "The following MKVs succeeded:"
    for mkv in "${SUCCESSMKVS[@]}"; do
        echo -e "\t${mkv}"
    done
    echo
    
    echo "The following MKVs were skipped:"
    for mkv in "${SKIPMKVS[@]}"; do
        echo -e "\t${mkv}"
    done
    echo
    

    【讨论】:

    • 嗨。感谢您的快速帮助。我会在一秒钟内尝试一下。我也在尝试合并 .mkv OR .mp4 ,到目前为止我已经得到了 'for i in *.{mkv,mp4};做'。关于如何将 mp4 部分合并到所有其他模式匹配部分中的任何快速想法? (如 ${i%mkv}")
    • 使用"$(basename "$i")" 而不是"${i%mkv}"。请注意,这也会删除.。没问题,很乐意提供帮助!
    猜你喜欢
    • 2017-06-14
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多