【问题标题】:Script to copy files on CD and not on hard disk to a new directory将 CD 上的文件而不是硬盘上的文件复制到新目录的脚本
【发布时间】:2010-04-12 16:58:20
【问题描述】:

我需要从一组包含大量重复内容的 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%,大量使用硬盘驱动器。

感谢您的帮助。

【问题讨论】:

  • 知道这个问题看起来很眼熟... :)

标签: windows scripting checksum file-management consolidation


【解决方案1】:

我不使用 Windows,但我会给出一个建议:GNU find 和 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(查看previous edition free online)。

【讨论】:

    猜你喜欢
    • 2013-12-02
    • 1970-01-01
    • 2015-12-24
    • 2014-04-30
    • 2011-06-15
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多