Categories
最新消息

為什麼 NAS 越用越滿?從重複檔案開始清理

不管是內接硬碟、外接硬碟、或是 NAS,用久了難免會有不少重覆的檔案。一個人用時是這樣,很多人共用時,更是如此。久而久之,這些重覆的資料會愈滾愈大,浪費儲存空間、也虛耗備份時間,甚至可能影響到資料的安全性。

有這麼嚴重嗎?我們來看幾個簡單的例子。

一、某攝影師在拍完照後,把照片從相機裡的記憶卡存到 NAS 裡,然後記憶卡忘了格式化。於是在下次拍完新一批的照片之後,他又把整張記憶卡的內容存進 NAS 一次,不管有沒有意識到檔案已經重覆了,或是根本不記得上次已經存了哪些檔案,這些檔案在同一顆硬碟裡就會存在副本,偏偏這對備份來說幫助不大。

二、行銷部門的展覽統籌在 A 資料夾放了一張圖片,內容是展覽的攤位主視覺。同部門的設計人員也在 B 資料夾放了同樣的圖片,方便自己作業。最後在給設計公司輸出時,又新增了一個資料夾,存放同樣的檔案來讓外部廠商存取,最後同樣內容的檔案在硬碟裡就佔了三個。過了一周,觀念很好的 MIS 人員設定的 3-2-1-1-0 策略啟動,於是這些資料又被備份了好幾次。

以上兩個例子,都是很常見的情況。除了浪費空間跟時間,相同的檔案一多,會造成版本管理的困擾,日後很有可能會難以判定哪些檔案是一樣的,甚至造成誤刪,結果一個正確的檔案都沒留下。

所以了,定時清理檔案會是節省時間與空間成本的好習慣。只不過,一個一個看未免太浪費時間,因此最好是透過第三方工具來達成此任務。

如何知道兩個、或者是多個檔案的內容是一樣的?

名不正則言不順,我們先把這次的任務定義清楚:找出 NAS 裡「完全重覆」的檔案及照片。有些應用是「找出類似的照片」,那是完全不同的工作類型,有機會再做介紹。

至於如何找出一模一樣的照片,由於照片也是以檔案的型態存在硬碟裡,只要檔案的內容相同,基本上就是同一張照片,因此我們可以把任務的核心目標再單純化:找出重覆的檔案即可。這個工作,通常被稱為「去重」。

問題來了,怎麼找?如何比對呢?大部份工具的演算法及思考模式,都會依循以下作法:

一、 先比對檔案大小

內容重覆的檔案,檔案大小一定是相同的。所以這些工具會先把硬碟裡體積相同的檔案過濾出來。

但是,大小完全相同的檔案,內容未必會是一樣的。比如有不少壓縮檔的分割是固定大小,一些文字檔的字元數相同的話,體積也會一樣,因此單純以體積來判斷是否為相同的檔案,只是第一步。

二、 再比對檔案「指紋」

由於數位檔案是以二進位的型態儲存,透過數學原理,每個檔案的內容都能計算出一組獨一無二的16進位字串,統稱為「雜湊(hash值)」。不同的演算法會計算出不同的雜湊值,算力較高的演算法(如 SHA-512)產生的雜湊值精準度較高,缺點是花時間;算力較低的演算法(如 MD5)產生的雜湊值精準度較低,優點是省時。

只要是不同的檔案,這些雜湊值在非人為干預下,基本上很難雷同,有個更專業的術語叫「碰撞(Collision)」,差別只在於容不容易被偽造而已。我們可以把它當成是每個檔案獨一無二的指紋,只要指紋一樣,就代表這兩個檔案是完全相同的。

既然比對雜湊值的精準度那麼高,為什麼還會需要先比對檔案大小呢?這樣才能節省時間跟資源。比對雜湊值會吃算力,但找出同樣體積的檔案對當代電腦來說幾乎不費吹灰之力,因此透過比大小先限縮數量,再來做雜湊值的計算,更加的高效。

在 NAS 環境比對,會快速得多

Windows 與 Mac 環境有不少桌面軟體可以處理此工作,然而,如果檔案已經存在 NAS 裡,直接在 NAS 裡執行此作業會省下不少時間。主要原因有兩個:

1、網路傳輸耗時

計算雜湊值需要讀取整個檔案的內容,在本機電腦頻繁的讀取 NAS 裡的檔案,在效率上不太理想。

2、原生工具支援 

NAS 雖然沒有內建比較簡單的去重工具(QNAP HBS 有提供備份的去重功能,日後再另文介紹),但是 Linux 環境下有不少套件能達成這個任務。

在 QNAP NAS 環境下,建議先開啟 SSH 機能,遠端登入命令列後,先利用 QPKG安裝 jdupes 這個套件。需要留意的是,jdupes 不是由QNAP 官方提供的套件,如果有安全性疑慮的話,建議可以在 docker 環境執行相關工作。

Jdupes 的執行參數非常簡單,比如我們要找出目前資料夾裡、包含所有子目錄中的重覆檔案,可以用這行指令:

jdupes -r .

「r」是recursive 遞迴的意思,「.」則是從這層目錄算起。執行後,工具會開始計算檔案內容,耗時便依檔案多寡及大小而定。因為這個工具會很頻繁的在 NAS 內部讀取硬碟,因此使用固態硬碟執行會快非常多。

比對結束時,工具會列出所有重覆的檔案,並做分組,如下圖:

可以發現,有很多檔名或路徑不同的檔案,骨子裡就是同一份資料。找出重覆的檔案後,下一步的動作就是刪除它。在剛才的指令上加上「d」,比如:

Jdupes -rd .

列出結果時,工具會詢問使用者要保留哪個檔案,其它便做刪除。如果要比對的數量少,此作法沒啥問題,但是當檔案一多時,比如有成千上萬組,總不可能一個個確認吧?

此時可以在參數中加上 N,如下:

Jdupes -rdN .

「N」代表的是「賣問啊,保留找到的第一個檔案就好」的意思,其它都會自動刪除。這個指令執行後,在目標目錄中就不會存在兩個以上的相同檔案,達到去重目的。

上圖中,路徑前有「+」號的,就是保留下來的檔案,至於有「-」號的,就是已經刪除。

以本文的測試為例,原本目錄的大小是 282GB,一共有 32,381 個檔案。進行去重後,分別減少了 8~17%。目錄是位於 TS-464 裡的固態硬碟上,整個作業時間耗時約 30  秒。作業完成後,不但節省了不少空間,在備份時也會快很多。

行文至此,一定有使用者會有此疑問:「那麼我想保留特定目錄裡的檔案怎辦?」「總不能把重要目錄裡的檔案刪掉吧?」

比如想保留 C:\Important 裡的檔案時,指令可以這麼下:

jdupes -rdN -X “path:Important” .

只要路徑中含有「Important」的檔案,就不會被刪除。

空間回收,從好的管理習慣開始

清理重複檔案不僅僅是為了騰出幾 GB 的硬碟空間,可說是對數位資產的斷捨離。透過 jdupes 這類高效能工具,我們能將原本耗時數天的手動比對,縮短為幾分鐘的自動化作業,大幅提升了 NAS 的儲存效率,也簡化了備份流程,確保 3-2-1-1-0 備份策略下的每一份資料都是獨特且具備價值的。

養成定期清理的習慣,配合精準的工具操作,NAS 才能真正發揮其作為「高效能資料中心」的優勢,讓儲存空間每一位元都用在刀口上。

Leave a comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *