0

我需要从一组包含大量重复内容的 CD 中复制文件,这些文件相互之间以及与我硬盘上已有的内容之间进行复制。相同文件的文件名不相同,位于不同名称的子目录中。我想将非重复文件从 CD 复制到硬盘上的新目录中。我不关心子目录 - 我稍后会整理出来 - 我只想要唯一的文件。

我找不到执行此操作的软件 - 请参阅我在 SuperUser 上的帖子https://superuser.com/questions/129944/software-to-copy-non-duplicate-files-from-cd-dvd

SuperUser 的某个人建议我使用 GNU 的“查找”和某些校验和工具的 Win32 版本编写一个脚本。我看了一眼,以前没有做过类似的事情。我希望存在一些我可以修改的东西。

我找到了一个很好的删除重复项的程序,Duplicate Cleaner(它比较校验和),但在这里它对我没有帮助,因为我必须将所有的 CD 复制到磁盘上,而且每个 CD 可能有大约 80% 的重复项,而且我没有空间这样做 - 我必须一次循环复制所有内容,然后转身删除其中的 80%,大量使用硬盘驱动器。

谢谢你的帮助。

4

1 回答 1

0

我不使用 Windows,但我会给出一个建议:GNUfind和 Lua 脚本的组合。因为find你可以试试

find / -exec md5sum '{}' ';'

如果您的 GNU 软件包含xargs以下内容,将是等效的,但可能会明显更快:

find / -print0 | xargs -0 md5sum

这将为您提供校验和和相应文件名的列表。我们将丢弃文件名并保留校验和:

#!/usr/bin/env lua

local checksums = {}

for l in io.lines() do
  local checksum, pathname = l:match('^(%S+)%s+(.*)$')
  checksums[checksum] = true
end

local cdfiles = assert(io.popen('find e:/ -print0 | xargs -0 md5sum'))

for l in cdfiles:lines() do
  local checksum, pathname = l:match('^(%S+)%s+(.*)$')
  if not checksums[checksum] then
    io.stderr:write('copying file ', pathname, '\n')
    os.execute('cp ' .. pathname .. ' c:/files/from/cd')
    checksums[checksum] = true
  end
end

然后,您可以通过管道输出

find / -print0 | xargs -0 md5um

进入这个脚本。

有几个问题:

  • 如果文件名有特殊字符,则需要用引号引起来。我不知道 Windows 上的引用约定。

  • 将校验和写入磁盘而不是一直运行 find 会更有效。你可以试试

    local csums = assert(io.open('/tmp/checksums', 'w'))
    for cs in pairs(checksums) do csums:write(cs, '\n') end
    csums:close()
    

    然后再次使用从文件中读回校验和io.lines

我希望这足以让你开始。你可以从http://lua.org下载 Lua ,我推荐一本很棒的书Programming in Lua在线免费查看上一版)。

于 2010-04-13T01:47:15.817 回答