
我有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 和螢幕運行所有內容
sudo apt-get install fslint
find path1/2/3 -type f -empty -delete
&find path1/2/3 -type d -empty -delete
(刪除所有空的或未完全複製的內容)/usr/share/fslint/fslint/findsn path1 path2 path3
(刪除不同磁碟上同一目錄下相同大小的所有內容)/usr/share/fslint/fslint/findup path1 path2 path3
(刪除所有重複檔案)find path1/2/3 -type d -empty -delete
(刪除findup後為空的目錄)
之後,我能夠mhddfs
再次將所有磁碟作為組合磁碟機安裝,而不會再次出現重複浪費磁碟空間