bash - 在 bash 'for loop' 结束时打印结果

标签 bash unix for-loop ffmpeg

我是初学者。
如果 mkv 文件存在于目录中,我有一个 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 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

关于bash - 在 bash 'for loop' 结束时打印结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37625845/

相关文章:

bash - glassfish死了并且不再重新开始

linux - 如何始终从所有命令中突出显示终端上的某些单词

python - python 的 shutil.move() 在 linux 上是原子的吗?

arrays - 获取嵌套循环中的迭代次数

java - 如何仅从 for 循环打印一次语句 - Java

javascript - For 循环是否处理表达式内的函数直到循环结束?

regex - 使用 sed 将空 CSV 值替换为 NULL

linux - 将目录从 abc.folder.xyz 重命名为folder.xyz

linux - 无法在jboss中使用部署命令执行shell脚本

python - 在 Windows 上安装 Django