【问题标题】:How to merge files in correct order using command prompt如何使用命令提示符以正确的顺序合并文件
【发布时间】:2018-11-18 21:59:51
【问题描述】:

我有一个文件夹,其中包含来自 mpeg-dash 视频的视频片段。 有一个“init.mp4”文件以及 275 个段,即“seg-1.m4s”、“seg-2.m4s”等。我想将它们合并到一个文件中。 我在 cmd 中使用以下命令: copy /b init.mp4 + seg-*.m4s source.mp4 上面的代码以错误的顺序合并文件。 see the merge order

如何以正确的顺序合并文件,例如 1,2,3...9,10,11..19,20...

另外请注意,我曾尝试使用循环将它们一一合并。但与上面的代码相比,这要慢得多

【问题讨论】:

  • 核心问题是cmd.exe将它们排序为字符串。有什么方法可以让所有文件以三 (3) 位值命名? seg-001.mp4、seg-020.mp4等
  • 感谢您的提示。我实际上是在使用 python 脚本来下载这些段。所以我可以很容易地用我想要的任何名字保存它们。我认为这解决了我的问题。再次感谢
  • 如果您已经在使用 Python 脚本,为什么不使用相同的脚本将每个段从源头附加到主文件?这样就不必再创建一个额外的脚本来进行合并了。
  • 我发现命令行选项更快。有什么方法可以仅使用 python 更快地合并文件?
  • 附注我没有创建单独的批处理脚本来合并。我在python中调用os.system( )函数

标签: batch-file cmd merge concatenation command-prompt


【解决方案1】:

一个非常简单的纯批处理文件解决方案:

@echo off
setlocal EnableDelayedExpansion

rem Sort file names in numerical order
for /F "tokens=1,2 delims=-." %%a in ('dir /B *.m4s') do (
   set /A "num=1000+%%b"
   set "file[!num!]=%%a-%%b.m4s"
)

rem Create the ordered list
set "files=init.mp4"
for /F "tokens=2 delims==" %%a in ('set file[') do set "files=!files! + %%a"

rem Do it
copy /B %files% source.mp4

【讨论】:

  • 问题是,如果有足够的文件,你将达到 8k 命令行长度限制。
  • 运行这个批处理脚本后,我得到了大小为 1kb 的 source.mp4
  • @DodgyCodeException: 使用 3 位数字,每个 + seg-123.m4s 文件名占用 14 个字符,因此此方法最多可管理 8192/14 = 585 个文件。 OP 指定了 275 个文件,所以...
  • 好点。但是为什么 OP 得到的文件大小只有 1 KB?也许你的第一个 for /f 应该使用命令而不是文件规范?
【解决方案2】:

这可以很容易地完成。将此代码放入名为mp4match.ps1 的文件中。此代码的关键是对文件名中的数值进行排序。它由regex 提取。

$segments = Get-ChildItem -File -Filter 'seg-*.mps' |
    Sort-Object @{Expression={([int]([regex]::match($_.Name, 'seg\-(\d*).mps')).Groups[1].Value)}} |
    ForEach-Object { $_.Name }

'init.mp4 ' + $segments -join ' '

然后,使用这个批处理文件来运行它。当COPY 命令看起来正确时,删除行首的ECHO

FOR /F "delims=" %%f IN ('powershell -NoProfile -File .\mp4match.ps1') DO (
    SET "FILE_LIST=%%f"
)
IF EXIST ".\source.mp4" (DEL ".\source.mp4")
COPY /Y %FILE_LIST% source.mp4

【讨论】:

    【解决方案3】:

    我认为您需要重命名文件:

     1 -  9 to 001 - 009:
    10 - 99 to 010 - 099:
    

    在 cmd 中:

    for /l %l in (1 1 9) do @ren seg-%l.m4s seg-00%l.m4s
    for /l %l in (10 1 99) do @ren seg-%l.m4s seg-0%l.m4s
    

    并在批处理文件中:

    for /l %%l in (1 1 9) do ren seg-%%l.m4s seg-00%%l.m4s
    for /l %%l in (10 1 99) do ren seg-%%l.m4s seg-0%%l.m4s
    

    在此之后,运行您的代码:

    copy /b init.mp4 + seg-*.m4s source.mp4 
    

    【讨论】:

    • @phclv- nOp- 需要先按正确的顺序放置文件,然后合并文件。
    • 没有。他不需要重命名文件。而且您只在我的评论之后添加合并部分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 2019-11-07
    • 2017-08-09
    • 1970-01-01
    相关资源
    最近更新 更多