複数のハードディスク上の重複ファイルを一度に検索して削除します

複数のハードディスク上の重複ファイルを一度に検索して削除します

ハードディスクが 4 台あり、この 4 台のハードディスク (サブディレクトリを含む) のどのファイルが重複しているかを調べたいと思っています。ハードディスク内だけでなく、他のすべてのハードディスクに対してもチェックする必要があります。

ハードディスクは大きい(3TB)ため、効率的である必要があります(チェックサムチェックよりもファイル名を優先するなど)

答え1

以下のスクリプトは、一度に最大10個のディレクトリ内の重複ファイルを検索し、組み合わせたディレクトリ。

fdupesこれは、 ( を実行fdupes -r)と の両方よりも大幅に高速になるはずです。fslintローカルに保存された 40 GB の比較的小さなディレクトリでは、スクリプトが重複リストを作成するのに 5 秒かかりましたが、 ではかなり長い時間 (約 90 / 100 秒) かかりましたfdupesfslint比較的低速な外付け USB ドライブ上のより大きなディレクトリ (700 GB、約 350000 ファイル) では、90 分かかりました。fdupes では、進行状況の表示を見ると 200 ~ 250 分以上かかっていたはずですが (これは便利です。以下のスクリプトでは進行状況が表示されません)、最後まで待ちませんでした。
たとえば、 はfslint追加機能を提供しますが、スクリプトには (現状のままでは) その機能はないため、比較は厳密に重複リストの作成についてのみであることに注意してください。

さらに、速度はディスクの読み取り速度にある程度依存します。私はいくつかのメディア (ネットワーク ドライブなど) をテストしましたが、特にファイル リストの作成にジョブ (の時間) の比較的大きな部分が費やされる小さなディレクトリでは大きな違いがありました。

結局のところ、どちらの方法でもすぐには終わらないので、ディレクトリが大きすぎないかと自問することになるかもしれません。

使い方

スクリプトが重複を検出すると、重複は次のようにリストされます。

Creating file list... /home/jacob/Bureaublad/test2
Creating file list... /home/jacob/Bureaublad/foto
Creating file list... /home/jacob/Bureaublad/Askubuntu
Checking for duplicates (10790 files)...
------------------------------------------------------------ 
>  found duplicate: test1.txt 2 

/home/jacob/Bureaublad/test2/test1.txt
/home/jacob/Bureaublad/test2/another directory/test1.txt
------------------------------------------------------------ 

等々

スクリプト

#!/usr/bin/env python3

import os
import sys

total_filelist = []
total_names = []

def find_files(directory):
    l = []; l2 = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            l.append(file)
            l2.append(root+"/"+file)
    return (l, l2)

i = 1
while i <= 10:
    try:
        dr = (sys.argv[i])
        print("Creating file list...", dr)
        total_filelist = total_filelist+find_files(dr)[1]
        total_names = total_names+find_files(dr)[0]
        i = i+1
    except IndexError:
        break

print("Checking for duplicates ("+str(len(total_names)),"files)...")

for name in set(total_names):
    n = total_names.count(name)
    if n > 1:
        print("-"*60,"\n>  found duplicate:",
              name, n, "\n")
        for item in total_filelist:
            if item.endswith("/"+name):
                print(item)

print("-"*60, "\n")

それを空のファイルにコピーし、名前を付けて保存しfind_dupes.py、次のコマンドで実行します。

python3 <script> <directory1> <directory2> <directory3> 

最大10ディレクトリ

スクリプトのその他のオプション

追加機能の追加は比較的簡単です。たとえば、重複したファイルを別のディレクトリに移動したり、名前を変更したりして、どのファイルを保持するかを手動または自動で決定できます。

仕事をやり遂げる方法

ディレクトリが大きすぎるようです。この作業を合理的に実行できるようにするには、システムが「詰まる」のを防ぐための、より洗練された別の方法があります。すべてのファイルタイプ(拡張子)に対して一度に作業を実行する代わりに、作業を分割することができます。ファイルタイプごとのセクション30,000 個のファイルのディレクトリでの小規模なテストでは、1 つの拡張子につき約 20 秒 (すべてのファイル) から 0.3 秒に時間が短縮されました。

スクリプトが 1 つのファイル タイプのみの重複を検索するようにするには、スクリプトのセクションを置き換えます。

def find_files(directory):
    l = []; l2 = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            l.append(file)
            l2.append(root+"/"+file)
    return (l, l2)

による:

def find_files(directory):
    l = []; l2 = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith(".py"): # example .py extension
                l.append(file)
                l2.append(root+"/"+file)
    return (l, l2)

発生するファイル拡張子の検索

ディレクトリ内に存在するすべてのファイル拡張子を一覧表示するには、以下のスクリプトを使用できます。

#!/usr/bin/env python3

import sys
import os

l = []
for root, dirs, files in os.walk(sys.argv[1]):
    for f in files:
        if (
        f.startswith("."),
        f.count(".") == 0,
        f.endswith("~"),
        ) == (False, False, False):
            l.append(f[f.rfind("."):])
for item in set(l):
    print(item)

それを空のファイルにコピーし、名前を付けて保存しfind_extensions.py、次のコマンドで実行します。

python3 <script> <diretory>

出力例:

.txt
.mp3
.odt
.py
.desktop
.sh
.ods

答え2

非常に優れた GUI を使用したい場合は、ソフトウェア センターから FSlint をお試しください。

(上のコメントで @lemonsqueeze さんがこれを提案しているのがわかります)。

FSlint の使用方法を概説した回答は次のとおりです。 https://askubuntu.com/a/472244/100356

答え3

私は FSlint プロジェクトを使用して、この作業を完了しました。

これらすべてを複数のディスクに整理し、CLIとスクリーンですべてを実行するという要件を満たすための私のプロセス

  1. sudo apt-get install fslint
  2. find path1/2/3 -type f -empty -delete& find path1/2/3 -type d -empty -delete(空または完全にコピーされていないものをすべて削除します)
  3. /usr/share/fslint/fslint/findsn path1 path2 path3(異なるディスク上の同じディレクトリに同じサイズで保存されているものをすべて削除します)
  4. /usr/share/fslint/fslint/findup path1 path2 path3(重複ファイルをすべて削除)
  5. find path1/2/3 -type d -empty -delete(findup 後に空になるディレクトリを削除するため)

その後、mhddfs重複してディスクスペースを無駄にすることなく、すべてのディスクを結合ドライブとして再度マウントできるようになりました。

関連情報