Я не использую 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
снова.
Надеюсь, этого достаточно, чтобы вы начали. Вы можете скачать Lua с http://lua.org,, и я рекомендую превосходную книгу Программирование на Lua (ознакомьтесь с предыдущим выпуском бесплатно онлайн ).