我想我已经非常接近拥有一个从目录开始的代码,然后使用 fd (而不是 find)和 ffmpeg 吐出一个固定的副本。我在这里将 if 语句编写为伪代码:
for i in $(fd -e .mp4 -e .avi);
do if [ffmpeg -v error -i "$i" -f null - 2] has an error, then
ffmpeg -err_detect ignore_err -i video.mkv -c copy video_fixed.mkv;
done
我相信,当您使用“致命”时,如果没有致命错误,文件将为空白/零。哪个会更容易,但我认为“错误”更合适。
我要修改的是如果有错误则执行IF语句,如果没有则不执行任何操作。如果出现错误,它将创建 video_fixed.mkv。但是,我也不希望它是 video_fixed.mkv,我希望它的文件名与 $i 相同,文件扩展名与原始文件相同,并用它替换原始文件。我也不确定 $i 是否只是文件名,或者包括整个路径的文件名,这使事情变得棘手,我必须捕获最后一个“/”之后的字符串作为文件名。
如果进行比较太难,我将不得不复制所有文件,无论它们是否有错误,但要做到这一点,我仍然需要命名并覆盖副本,使其与原始文件相同。
谢谢
答案1
我还没有尝试过 IF 语句,但是我已经取得了足够的进展。
从包含视频文件的文件夹运行以下命令 -
创建名为 CorrectedVideos 的重复文件夹以将所有内容保存在:
IFS=$'\n'; find . -type d | xargs -I {} mkdir -p /home/Rob/Desktop/correctedVideos/{}; for i in $(fd -e .mp4 -e .avi); do ffmpeg -err_detect ignore_err -i "$i" -c copy "/home/Rob/Desktop/correctedVideos/$i"; done
其中 i 是一个变量,例如来自 for 循环或输入的变量,可以是任何不一定是 i-
仅显示文件名:${i##*/}
将仅显示当前目录下的文件路径:${i%/*}
将显示当前目录的相对文件路径和文件名:“$i”
所以“$i”与${i%/相同}/${i##/}
您需要使用绝对路径,完整而不是“~”
PS 如果您不想创建其中包含副本的并行文件夹,而是想在现有文件夹中创建副本,有两种方法 -
方法 1:对于单个文件夹中的每个文件(如果有子文件夹就会出现问题,因此不要在有子文件夹的文件夹中使用):
IFS=$'\n'; for i in $(fd -e .mp4 -e .avi); do echo ffmpeg -err_detect ignore_err -i "$i" -c copy "copied_$i"; done
方法 2:对于包含子文件夹的文件夹,但如果运行该命令的顶级文件夹中有任何文件,则该方法不起作用:
IFS=$'\n'; for i in $(fd -e .mp4 -e .avi); do ffmpeg -err_detect ignore_err -i "$i" -c copy "$PWD/${i%/*}/copied_${i##*/}"; done