我有这个脚本可以从很多mp4
视频中提取一帧并将它们存储为png
for i in *.mp4; do
[ -f "$i" ] || break
number=$(echo "$i" | grep -o -E '[0-9]+')
name=frame"$number".png
ffmpeg -i "$i" -ss 00:01:00.000 -vframes 1 "$name"
done
视频被命名为video1.mp4
,video2.mp4
等。因为循环使视频乱序,我从视频中提取数字以生成输出文件名。
这很好用,但文件的文件名png
是这样的:
frame1?4.png
, frame3?4.png
, frame3?4.png
...
为什么?4
?
啊,我现在看到 4 来自 mp4 上的 4。我怎样才能得到第一个数字?
这
?
只是一个占位符输出,ls
用于表示您嵌入文件名中的换行符。会输出:
因为该文件名中有两个 1 个或多个十进制数字的序列。
相反,你可以这样做:
这将提取去除其扩展名的文件名上最右边的十进制数字序列,并避免为每个文件运行多个命令。
请注意,该代码仅使用标准 POSIX sh 语法,因此您无需
bash
运行它。使用bash
或其他ksh93
类似的 shell,如果您知道文件的根名称仅包含一个数字序列,您还可以使用:具有
bash
特定功能:将提取根名称中最左边的数字序列。
与
zsh
:您已正确确定
4
来自.mp4
文件名中的扩展名。问号可能会ls
显示在每个匹配项之间插入的换行符grep -o
(顺便说一下,这是不信任ls
显示的文件名的原因之一)。要提取第一个数字,或者更确切地说,
.mp4
扩展前的最后一个数字,您可以这样做这首先从名称中删除扩展名,
i
然后从开头删除所有非数字。