0

重複するコンテンツがたくさんあるCDのセットから、お互いに、そしてすでにハードディスクにあるものと一緒にファイルをコピーする必要があります。同一ファイルのファイル名は同じではなく、異なる名前のサブディレクトリにあります。重複していないファイルをCDからハードディスクの新しいディレクトリにコピーしたい。サブディレクトリは気にしません-後で整理します-一意のファイルが必要なだけです。

それを行うためのソフトウェアが見つかりません-SuperUserの私の投稿を参照してくださいhttps://superuser.com/questions/129944/software-to-copy-non-duplicate-files-from-cd-dvd

SuperUserの誰かが、GNUの「検索」といくつかのチェックサムツールのWin32バージョンを使用してスクリプトを作成することを提案しました。私はそれをちらっと見ました、そして以前にそのようなことをしたことがありません。変更できるものが存在することを望んでいます。

重複を削除するのに適したプログラム、Duplicate Cleaner(チェックサムを比較する)を見つけましたが、すべてのCDをディスクにコピーする必要があり、それぞれがおそらく約80%重複しているため、ここでは役に立ちません。それを行う余地はありません-一度にいくつかを循環してすべてをコピーし、次に向きを変えてその80%を削除し、ハードドライブを頻繁に操作する必要があります。

助けてくれてありがとう。

4

1 に答える 1

0

私は 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もう一度使用してファイルからチェックサムを読み込みます。

これで始められることを願っています。Lua はhttp://lua.orgからダウンロードできます。私はすばらしい本Programming in Luaをお勧めします (以前の版をオンラインで無料でチェックしてください)。

于 2010-04-13T01:47:15.817 に答える