使用 find -exec 和 while 创建 for 循环

使用 find -exec 和 while 创建 for 循环

我正在尝试制作这个脚本,循环播放 00 点到 12 点之间创建的视频文件,使用 ffmpeg 转换它们,然后删除它们。

该脚本的工作原理是查找文件并启动 ffpmeg,但在 ffmpeg 第一次转换开始后,它似乎继续从 find -exec“发送”字符,并最终破坏 ffmpeg 并停止转换。如何修改脚本以免发生这种情况?

当前脚本

!/bin/bash -e
find /videos/. -type f -print0 -exec sh -c 'h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 00 ] && [ "$h" -lt 12 ]'   sh {} \;|while read -d $'\0' i;
do 
    ffmpeg -y -i "$i" -vcodec libx264 -crf 27 -preset veryfast -movflags +faststart -c:a copy -threads 14 /output/"$(basename "$i" .ts)".mp4
    rm -f -- "$i"
done

答案1

感谢戈登·戴维森(Gordon Davisson),我设法解决了这个问题。如果将来有人碰巧遇到这个问题,这里是完整的工作脚本。

#!/bin/bash -e
find /videos/. -type f -exec sh -c 'h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 00 ] && [ "$h" -lt 12 ]' sh {} \; -print | while IFS= read -r i;
do 
    ffmpeg -y -i "$i" -vcodec libx264 -crf 27 -preset veryfast -movflags +faststart -c:a copy -threads 14 /output/"$(basename "$i" .ts)".mp4 </dev/null
    rm -f -- "$i"
done

相关内容