一次尋找並刪除多個硬碟上的重複文件

一次尋找並刪除多個硬碟上的重複文件

我有4個硬碟,想找出這4個硬碟上的哪些檔案(包括子目錄)是重複的。不僅應該在硬碟內檢查它,還應該針對所有其他硬碟進行檢查。

硬碟很大(3TB),因此它必須有效率(第一個檔案名稱比校驗和檢查左右)

答案1

下面的腳本一次在最多 10 個目錄中尋找重複文件,在合併的目錄。

fdupes它應該比(running fdupes -r) 和fslint;快很多。在本地儲存的 40GB 相對較小的目錄中,腳本花了 5 秒創建重複列表,而它花費了fdupes更長fslint的時間(約 90 / 100 秒)。在相對較慢的外部 USB 驅動器上的較大目錄(700GB,約 350000 個檔案)上,需要 90 分鐘。如果使用 fdupes,請查看進度指示(這很好,下面的腳本沒有顯示進度),可能會超過 200-250 分鐘,但我並沒有一直等到它。
我應該提到的是,例如fslint提供了腳本沒有的附加功能(按原樣),因此比較嚴格限於創建欺騙清單。

此外,速度部分取決於磁碟讀取的速度:我測試了幾種差異巨大的媒體(網路磁碟機上的 ao),特別是在較小的目錄上,其中建立檔案清單需要相對大部分的工作('時間)。

最重要的是,無論哪種方式,這都不是一個快速的工作,您可能會問自己目錄是否太大。

怎麼運作的

當腳本發現重複項時,重複項會列出如下:

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 個檔案的目錄進行的小測試縮短了 appr 的時間。 1 個擴充需要 20 秒(所有檔案)到 0.3 秒。

若要使腳本僅查找一種文件類型的重複項,請取代腳本的部分:

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再次將所有磁碟作為組合磁碟機安裝,而不會再次出現重複浪費磁碟空間

相關內容