我的目录中有一个要连接的视频列表。
Video1.mpg
Video2.mpg
.
.
.
Video35.mpg
我想按照它们的编号顺序连接它,而不必将它们全部手动写入 cat 命令。
答案1
与zsh
和ffmpeg
:
files=(Video*.mpg(n))
ffmpeg -f concat -safe 0 -i <(printf 'file %s\n' ${(qq)files}) -c copy output.mpg
(n)
是zsh
一个全局限定符按数字排序。(qq)
是一个用单引号引起来的变量扩展标志。ffmpeg
如果文件名包含单引号、反斜杠或换行符,我不能保证它的引号与预期的完全相同。
据我了解,上面假设所有 mpg 文件使用相同的编解码器。
AFAICT,mpeg
特别是对于文件,文件也可以在文件级别连接,并且仍然可以被大多数玩家播放,因此您也可以简单地执行以下操作(仍然使用zsh
):
cat Video*.mpg(n) > output.mpg
虽然zsh
在 macOS 中默认安装,但它不是您在终端中获得的默认 shell,除非您明确更改了默认的登录 shell bash
。因此,您需要首先在终端中的 shell 提示符下zsh
输入,或者运行:zsh
bash
zsh -c 'cat Video*.mpg(n) > output.mpg'
反而。
答案2
使用 Bash 大括号扩展。
cat Video{{1..9},{10..35}}.mpg > outputfile
将来,0
在最初命名文件时使用填充,因此您可以这样做:
cat Video{01..35}.mpg > outputfile
答案3
这是一种方法:
cat $(ls Video*.mpg | sort -to -k2 -n )>outputfile
ls Video*.mpg
- 根据模式列出文件- 使用分隔符、第二个键和数字对
sort -to -k2 -n
文件进行排序o
-n
*请意识到,ls
在未知的文件列表上使用可能是不可预测的,但根据问题,这是一个相对较小且已知的列表。