Lane East 的 blog

一百年很短,一秒钟很长

分块搬运文件

2009-06-16 18:14

最近公司的电脑硬盘空间有些吃紧, 所以打算把 MSDN Library 之类大的文件移回自己屋里去, 但是我的 U 盘只有 1G, 文件的大小超过这个大小, 所以只能一次搬一部分回去了.

通常的做法是切割文件, 或者使用压缩软件分卷压缩, 但是我现在的问题是, 空间不够了, 所以也没太多的空间来存放分割后的文件, 直接往 U 盘上切割的确是可以, 但是我一次只能复制一部分, 下次再复制后面的, 所以这样的做法也不太行得通了.

于是想到了 dd 这个 linux 下的命令, 因为之前帮别人解决问题的时候曾经找过 dd for windows, 正好可以拿来用.

我常用的 dd 命令的参数有如下的几个:

  • if 指定要复制的源文件名
  • of 指定目标文件名
  • bs 复制的块的大小
  • count 复制的块的数量

所以我要一个文件的前 200K, 那只需要用 bs=100k count=2 就可以了. 当然, 我现在的情况还需要跳过某些部分, 所以还用到了 skip 参数.

假如我复制的文件名叫“somefile.zip”(当然, 这个文件名是“马赛克“过的), 在 E:\ 下, 我的 U 盘的盘符是 I:, 那么我就可以用:

dd if=e:\somefile.zip of=I:\somefile.zip bs=1M count=700

这样就复制了开始的 700M, 拿回自己屋复制到硬盘上, 等下次搬下一块的时候, 就可以用:

dd if=e:\somefile.zip of=I:\somefile.zip.2 bs=1M skip=700

我要复制的文件没超过 1400M, 所以这里就不用指定 count 了, 直接就把剩下的部分复制到 I:\somefile.zip.2 中去了.

然后回到自己住的地方, 需要把两个文件合并了, 我在第一次的时候复制到 U 盘上用“somefile.zip“作文件名是因为我在合并的时候, 也不打算用中间文件, 不想都复制到自己的电脑中然后再合并, 而是直接把后来复制的内容添加到第一次复制的文件末尾, 所以直接用原来的名称就不用改名了. 我第一次把文件复制到 /home/lane/somefile.zip(我自己的电脑装的是 linux), 那么这次就直接用:

cat /media/disk/somefile.zip.2 >> /home/lane/somefile.zip

这样, 原本就可以把 somefile.zip.2 附加到 /home/lane/somefile.zip 的结尾部分的, 但是因为我忘记我自己的电脑上用的是一块小硬盘, 空间也不够了, 这样一来, 就附加了一部分到后面, 然后就没空间了, 只好打开大的硬盘, 把 /home/lane/somefile.zip 移动过去, 然后再把 somefile.zip.2 继续附加到后面, 但是因为已经附加了一部分了, 所以现在不能直接附加了, 所以我用了 dd 命令的另一个参数: seek, 这个参数让 dd 在写入目标文件的时候跳过一定数量的块, 所以现在我用:

dd if=/media/disk/somefile.zip.2 -of=/media/disk-1/somefile.zip bs=1M seek=700

这样就可以在 somefile.zip 的 700M 之后写入 somefile.zip.2 了, 于是就相当于把 somefile.zip.2 附加到了 somefile.zip 的后面.

然后用我之前在公司电脑上做的 sha1 校验码检查一下, 没有问题, 这样我就可以把公司电脑上的文件给删除了.

当然, cat 命令也有 windows 版的, 或者直接使用 dd 也可以, 就不需要再多一条命令了.

dd 比一般的分割工具好的地方是:

  • 不需要一次处理全部, 可以这次复制一点, 下次复制一点.
  • 不一定是固定大小, 可以这次复制 700M, 下次复制 100M, 如果有多个 U 盘, 那就可以在这个 U 盘上写 700M, 在那个 U 盘上写 200M, 再那个….
  • 目标位置可以变化, 这次写到 I: 盘, 下次可以写到 J: 盘, 如果有多个 U 盘…
  • 不需要把文件临时分割到一个位置(这个可以说是上面几点结合起来形成的效果)
  • 写入目标文件的时候也不需要复制之后再合并.

当然, 分割工具也可以做到这些功能, 但是那样的话, 不就是 dd 命令的图形化的 简化 版本了么?

之所以说是简化版本, 是因为, dd 还有些其它的功能, 比如可以直接操作设备: 你可以用 dd if=\\?\Device\CdRom0 of=c:\disc.iso 来直接做一个光盘镜像, 当然, 也可以配合 bs, count, skip, seek 来多次复制一个光盘镜像到另外一台电脑上, 比如一台电脑有 DVD 光驱, 另一台没有, 当然这是很少见的情况了.

分类:

评论

  预览后可提交