我不使用 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(在线免费查看上一版)。