2010-04-12 12 views
0

J'ai besoin de copier des fichiers à partir d'un ensemble de CD qui ont beaucoup de contenu en double, les uns avec les autres, et avec ce qui est déjà sur mon disque dur. Les noms de fichier de fichiers identiques ne sont pas identiques et se trouvent dans des sous-répertoires de noms différents. Je veux copier des fichiers non dupliqués à partir du CD dans un nouveau répertoire sur le disque dur. Je ne me soucie pas des sous-répertoires - je vais le trier plus tard - je veux juste les fichiers uniques.Script pour copier des fichiers sur CD et non sur disque dur dans un nouveau répertoire

Je ne peux pas trouver un logiciel pour le faire - voir mon post à SuperUser https://superuser.com/questions/129944/software-to-copy-non-duplicate-files-from-cd-dvd

Quelqu'un à SuperUser m'a suggéré d'écrire un script en utilisant « trouver » de GNU et la version Win32 de certains outils de contrôle. J'ai jeté un coup d'œil à cela et je n'ai rien fait de tel auparavant. J'espère que quelque chose existe que je peux modifier.

J'ai trouvé un bon programme pour supprimer les doublons, Duplicate Cleaner (compare les checksums), mais cela ne m'aidera pas ici, car je devrais copier tous les CD sur le disque, et chacun est probablement à 80% Je n'ai pas de place pour faire cela - je devrais faire défiler quelques copies à la fois, puis faire demi-tour et supprimer 80% de mon temps, en travaillant beaucoup sur le disque dur.

Merci pour toute aide.

+0

Je * savais * que cette question me semblait familière ... :) –

Répondre

0

Je n'utilise pas Windows, mais je vais vous donner une suggestion: une combinaison de GNU find et un script Lua. Pour find vous pouvez essayer

find/-exec md5sum '{}' ';' 

Si votre logiciel GNU comprend les éléments suivants xargs sera équivalent, mais peut être beaucoup plus rapide:

find/-print0 | xargs -0 md5sum 

Cela vous donnera une liste des noms de fichiers correspondants et checksum. Nous jetterai les noms de fichiers et de garder les checksums:

#!/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 

Vous pouvez alors redirigez la sortie de

find/-print0 | xargs -0 md5um 

dans ce script.

Il y a quelques problèmes:

  • Si le nom du fichier contient des caractères spéciaux, il devra être cité. Je ne connais pas les conventions de citation sur Windows.

  • Il serait plus efficace d'écrire les sommes de contrôle sur le disque plutôt que d'exécuter la recherche tout le temps. Vous pouvez essayer

    local csums = assert(io.open('/tmp/checksums', 'w')) 
    for cs in pairs(checksums) do csums:write(cs, '\n') end 
    csums:close() 
    

    Et puis lire checksums retour dans le fichier en utilisant io.lines à nouveau.

J'espère que cela est suffisant pour vous aider à démarrer. Vous pouvez télécharger Lua à partir de http://lua.org, et je recommande le superbe livre Programming in Lua (consultez le previous edition free online).