我有以下 bash 脚本,可生成与视频文件同名的 jpg 文件。现在我需要更改 bash 脚本,以生成名为 image.jpg 的 jpg 文件,而不是与视频同名的 jpg 文件。
我尝试了很多不同的方法来做到这一点,但我不太擅长编写 bash 脚本,而且我在基本名称和子目录方面遇到了一些问题。
你能帮助我吗?
#!/bin/bash
for i in */*.mp4; do
j=`basename $i .mp4`;
/usr/bin/ffmpeg -i "$i" -r 1 -f image2 -vframes 1 -s 640x360 -ss 0:0:30 $j.jpg;
done
按照目录树
/
/a/video1.mp4
/b/video2.mp4
/c/video3.mp4
按照我需要的结果
/
/a/video1.mp4
/a/image.jpg
/b/video2.mp4
/b/image.jp4
/c/video3.mp4
/c/image.jpg
非常感谢!
答案1
有一个问题for i in */*.mp4
:您不能像这样循环遍历子目录中的文件(试试看:for i in */*.mp4; do echo $i; done
,这只会打印*/*.mp4
)。
对于这种情况,没有其他办法find
。
一个班轮解决方案find
:
find /your/base/directory -type f -iname "*.mp4" -execdir /usr/bin/ffmpeg -i "{}" -r 1 -f image2 -vframes 1 -s 640x360 -ss 0:0:30 image.jpg \;
答案2
只需设置j
为所需的名称
j=image
而不是将其设置为视频的基本名称。
答案3
更改你的 bash 代码;)
#!/bin/bash
for i in */*.mp4; do
DIR=$(dirname ${i})
/usr/bin/ffmpeg -i "$i" -r 1 -f image2 -vframes 1 -s 640x360 -ss 0:0:30 $DIR/image.jpg;
done