1

Linux環境では、ファイルのmd5で重複した画像を削除する必要がありますが、削除する前に、ファイルにいくつかのCSVリストを書きたいです

削除されたファイル -> リンクされた最初のファイル 削除されたファイル -> リンクされたファイル

等。

問題は、私がの構造を持っていることです

メインフォルダー サブフォルダー サブサブフォルダー サブサブサブフォルダー
画像

200.000 以上のファイル

したがって、スクリプトはハングせず、高速であることが非常に優れているはずです。

どの方向を提案しますか?

私は手元にubuntuを持っています。

アップデート:

必要なものを少し変更するだけで実行できるスクリプトを見つけました。md5 の重複を検索して見つけ、重複を削除します。必要な最後のステップは、削除されたファイルのリストを含むファイルを作成することです->残っている複製

#!/bin/bash

DIR="/home/gevork/Desktop/webserver/maps.am/all_tiles/dubai_test"

find $DIR -type f -exec md5sum {} \; | sort > /home/gevork/Desktop/webserver/maps.am/all_tiles/dubai_test/sums-sorted.txt

OLDSUM=""
IFS=$'\n'
for i in `cat /home/gevork/Desktop/webserver/maps.am/all_tiles/dubai_test/sums-sorted.txt`; do
 NEWSUM=`echo "$i" | sed 's/ .*//'`
 NEWFILE=`echo "$i" | sed 's/^[^ ]* *//'`
 if [ "$OLDSUM" == "$NEWSUM" ]; then
  echo rm  "$NEWFILE"
 else
  OLDSUM="$NEWSUM"
  OLDFILE="$NEWFILE"
 fi
done
4

1 に答える 1

0

Python はこれらのタスクに適したツールであり、移植性も高いと思います (ただし、質問は Linux に限定されています)。以下のコードは、重複の中で最も古いファイル (作成時間まで) を保持します。それが問題にならない場合は、単純化できます。使用するには、たとえば「remove_dups.py」として保存し、python remove_dumps.py startdir. からstartdir、3 レベルの深さのディレクトリを検索し、その内容の md5 合計を計算します。ハッシュごとにファイル名のリストを保存します。後のテキスト ファイルは stdout に出力されるため、実際にはpython remove_dumps.py startdir > myoutputfile.txt. また、この出力ファイルに開始ディレクトリを格納します。他の各行は次のようにフォーマットされmd5sum: file1, file2, file3, ...ます。重複ファイルの場合。これらのうち最初のものは保持され、残りは削除されます。

import os
import sys
import glob
import hashlib
from collections import defaultdict

BIG_ENOUGH_CTIME = 2**63-1

start_dir = sys.argv[1]

hash_file = defaultdict(list)
level3_files = glob.glob(os.path.join(start_dir, "*", "*", "*", "*"))
for name in level3_files:
    try:
        md5 = hashlib.md5(open(name).read()).hexdigest()
    except Exception, e:
        sys.stderr.write("Failed for %s. %s\n" % (name, e))
    else:
        # If you don't care about keeping the oldest between the duplicates,
        # the following files can be simplified.
        try:
            ctime = os.stat(name).st_ctime
        except Exception, e:
            sys.stderr.write("%s\n" % e)
            hash_file[md5].append((BIG_ENOUGH_CTIME, name))
        else:
            hash_file[md5].append((ctime, name))

print "base: %s" % (os.path.abspath(start_dir))
for md5, l in hash_file.items():
    if len(l) == 1:
        continue

    # Keep the oldest file between the duplicates.
    l = sorted(l)
    name = [data[1] for data in l]

    # md5sum: list of files. The first in the list is kept, the others are
    # removed.
    print "%s: %s" % (md5, ','.join('"%s"' % n for n in name))

    original = name.pop(0)
    for n in name:
        print "%s->%s" % (n, original)
        sys.stderr.write("Removing %s\n" % n)
        try:
            os.remove(n)
        except Exception, e:
            sys.stderr.write("%s\n" % e)
于 2013-01-13T14:42:06.420 に答える