我不使用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上的引用約定。
將校驗和寫入磁盤比運行查找更有效。你可以嘗試
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)。
我*知道*這個問題看起來很熟悉...... :) – 2010-04-12 17:01:25