【问题标题】:Merge/Join Files *.001, *.002, *.003.. Without Copying to New One合并/加入文件 *.001、*.002、*.003.. 而不复制到新文件
【发布时间】:2012-09-09 12:46:34
【问题描述】:

如何在不复制到新文件的情况下将文件合并为一个?
资料来源:我有 file.dd.001、file.dd.002、file.dd.003、file.dd.004 ...
任务:我有 600 个文件(1,5 Gb)。所有这些文件的容量:大约 900 GB。硬盘容量:1.5 TB。我无法使用 Total Commander 或 7-zip 或 WinRAR 加入这些文件,因为硬盘容量无法复制到新文件中(可用空间不足)。
需要:加入文件,可能会多次执行程序,但是:
1) 加入 100 个第一个文件 (150 GB)。删除拆分的文件(前 100 个)。
2) 加入接下来的 100 个文件到这个合并的文件 (150 GB)。删除这 100 个文件。
3) 将下 100 个文件加入合并文件 (300 GB)...
问题:谁能告诉我如何将文件合并(加入)到新的越来越大的文件中?也许软件存在,或者是用 C# 代码解决这个问题的最后机会。任何想法

【问题讨论】:

    标签: windows file join


    【解决方案1】:

    自己写。

    打开文件 #1。寻求结束。打开文件 #2,开始读取内容并附加到文件 #1。

    完成后,删除文件 #2,然后继续处理文件 #3。

    在合理的脚本语言中应该是

    我不了解 Windows,但在 unix 上你可以这样做:

    for num in `seq -w 2 600`; do
        cat file.dd.$num >> file.dd.001
        rm file.dd.$num
    done
    

    注意使用追加>> 输出重定向。

    您可能可以通过使用dd 而不是cat 使其更快,这应该使用零拷贝传输(即让内核完成工作,而不是将文件读入内存并将其写入输出流)。

     dd if=file.dd.$num of=file.dd.001 conv=notrunc oflag=append bs=10M
    

    这应该让你接近你的硬盘在 IO 上可以提供的任何东西。

    【讨论】:

      【解决方案2】:

      感谢@Anony-Mousse 提供有用的 Linux 代码示例
      问题已解决……
      Windows 有 cmd 命令,我在 Windows Forensic Analysis Dvd Toolkit 2E (2009) by Harlan Harvey 一书中找到了该命令。 448:

      D:\Images>type image.001 >  image_all.img
      D:\Images>type image.002 >> image_all.img
      D:\Images>type image.002 >> image_all.img
      

      如果我有 300 Gb 的文件 (image_all.img),我需要加入 50 个文件 (1,5 Gb),我需要:

      D:\Images>type image.200 >> image_all.img
      D:\Images>type image.201 >> image_all.img
      D:\Images>type image.202 >> image_all.img
      D:\Images>type image.203 >> image_all.img
      ….
      D:\Images>type image.498 >> image_all.img
      D:\Images>type image.499 >> image_all.img
      

      或者,更好:

      D:\Images>type image.* >> image_all.img
      

      它将文件夹中的所有文件(带掩码)连接到文件image_all.img

      【讨论】:

      • 还有here 一些其他答案。也许,有人想看看
      【解决方案3】:

      我假设您想合并这些文件以简化处理,对吗?如果这是您的目标,那么更有效的方法是使用 FIFO 文件。在 *nix(linux、macos、*bsd 等)上,您可以使用 mkfifo 命令创建一个“表示”所有文件的 FIFO 文件,如下所示:

      mkfifo mybigfile
      cat file.dd.* > mybigfile &
      {{process}} mybigfile
      

      mybigfile 文件将包含您的 file.dd.{001,002,003...} 文件的所有内容,您可以将所有这些文件作为一个大文件处理。一旦您的进程完成读取文件,mybigfile 将为空,要“重新填充”它,您需要执行“cat file.dd.* > mybigfile &”命令

      现在,原始问题包含许多微软 Windows 参考(C#、w​​inrar 和总指挥官),所以我认为作者需要一个 Windows 解决方案。我不是 windows 人,但我相信上面可以在 cygwin 下或通过使用命名管道和 PowerShell 使用(但我可能完全错了)

      【讨论】:

        猜你喜欢
        • 2010-10-27
        • 2018-12-11
        • 1970-01-01
        • 1970-01-01
        • 2014-08-29
        • 2012-08-15
        • 2012-04-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多