2010-04-12 40 views
0

我需要從一組CD中複製具有大量重複內容,相互之間以及硬盤上已有內容的文件。相同文件的文件名不相同,並且位於不同名稱的子目錄中。我想將CD中非重複的文件複製到硬盤上的新目錄中。我不在乎子目錄 - 我將在稍後分類 - 我只想要獨特的文件。將文件複製到CD而不是硬盤上的腳本到新目錄

我找不到軟件來做到這一點 - 看到我的帖子在超級用戶https://superuser.com/questions/129944/software-to-copy-non-duplicate-files-from-cd-dvd

有人在超級用戶建議使用我GNU的「發現」和一些校驗工具Win32版本編寫腳本。我瞥了一眼,並沒有做過這樣的事情。我希望能夠修改的東西存在。

我發現了一個很好的程序來刪除重複項,Duplicate Cleaner(它比較校驗和),但它不會幫助我,因爲我必須將所有CD複製到磁盤,每個CD可能大約80%重複,而且我沒有空間這樣做 - 我必須一次性複製所有內容,然後轉向並刪除其中的80%,然後在硬盤上做很多工作。

感謝您的任何幫助。

+0

我*知道*這個問題看起來很熟悉...... :) – 2010-04-12 17:01:25

回答

0

我不使用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)。