報告目錄,其內容即使分散在其他地方也存在
我想生成一份我知道可以安全刪除的目錄報告(即使需要快速手動驗證),因為我知道完整的內容一直存在於其他地方**——即使,特別是如果重複文件隨機分散在卷的其他地方,可能在完全不同的目錄佈局中,在相關目錄中不存在的文件中。**
換句話說,目錄結構和內容不會完全相同。但是 100% 包含的文件將被單獨複製……在同一個 FS 上的某個地方、任何地方。
鑑於我的工作流程和下面的案例,應該清楚這幾乎總是一種單向關係。dir1 的文件內容 100% 可能存在於別處,具有不同的文件名和目錄結構,通常每個文件不止一個副本。
例如,dir1/file1 的副本可能存在於 dir2 和 dir3 中。dir1/file2 的副本可能存在於 dir2 和 dir4 中。dir2、dir3 和/或 dir4 也可能包含它們自己的唯一文件,以及來自其他目錄的文件副本。但是 dir1 絕對可以安全地刪除。
換句話說,不存在逆相關:dir1 有 100% 的冗餘散佈在各處;但是 dir2、dir3、dir4…等。不一定。(他們可能,因此也可能是刪除候選者,但目前主要的候選者是 dir1。)
為了理解和回答這個問題,這個問題的其餘部分並不是必須閱讀的。它只是回答了一些潛在的切線“為什麼?” 和“你試過……嗎?” 問題。
這是產生需求的案例,這實際上似乎相當普遍(或至少並不少見)。…至少在最終結果上有所不同:
現場:
我拍攝 GB 的照片和影片。
每天,我都會將儲存卡中的文件移動到按相機名稱和日期組織的文件夾中,然後移動到冗餘的攜帶式 USB 硬碟陣列中。
當我有時間時,我會將這些文件的副本組織到一個文件夾結構中,如“(照片|影片)/年份/日期”,文件名前面加上“yyyymmdd-hhmmss”。(換句話說,原始結構被完全打亂了。而且並不總是以這種可預測的方式。)那些有組織的副本放在 SSD 驅動器上以加快工作流程,但我將原始的、非託管的副本留在緩慢的冗餘儲存上,以進行備份,除了在複製步驟期間,副本在物理上是分開的。
回到家:
我將所有非託管文件從 USB HDD 陣列移動到“永久”(更大、更強大且持續雲備份)陣列,作為原始事實來源,以防我的工作流程出現問題。
對 SSD 上的組織副本進行後處理。(除了重命名之外,保持原始原始文件不變 - 並將更改保存到新文件。
一旦我完成並對結果進行任何預期的操作,我將整個 SSD 文件結構移動到與原始文件相同的更大的“永久”陣列上。(但請記住,目錄結構與原始 SD 卡轉儲結構完全不同。)
理想情況下,在該工作流程中,我還會刪除現在不需要的原始卡片轉儲文件夾。問題是,就像在生活中一樣,我的工作流程經常被打斷。要麼我沒有時間完成現場組織,要麼回家後暫時擱置了一段時間,或者我每次都沒有以完全相同的方式組織,或者我只是對存在的東西感到困惑害怕刪除任何東西。很多時候,在出發前,我會將攜帶式媒體複製到永久陣列上以防萬一,即使我懷疑它可能已經存在 2 或 3 次。(我不是強迫症。只是因為經驗而傷痕累累。)有時(在後來的幾年中不太如此)我會重新組織我的整個邏輯目錄結構。其他時候,我會在中途對其進行更新,而將以前的內容單獨保留。多年來,我也搬家了,完全忘記了“卡片轉儲”文件的去向(以及如何)。有時,我的現場工作流程(儘管定義明確並經過測試)會導致各種文件夾的狀態不確定,因此我會製作更多備份副本以“以防萬一”。我還曾經編寫過創建數千個文件夾符號連結的程序,以便以不同的方式查看我龐大的文件夾結構。(就像文件系統的“數據透視表”。)但後來 rsync’ed 整個文件系統以替換數組,同時忘記設置“保留硬連結和符號連結”標誌,並得到以前顯然只是連結的副本,然後隨著時間的流逝,它們實際上是原件。(嘗試使用 20 年的照片/影片以及 30 年的其他數據來獲得更好的結果!)有時,我的現場工作流程(儘管定義明確並經過測試)會導致各種文件夾的狀態不確定,因此我會製作更多備份副本以“以防萬一”。我還曾經編寫過創建數千個文件夾符號連結的程序,以便以不同的方式查看我龐大的文件夾結構。(就像文件系統的“數據透視表”。)但後來 rsync’ed 整個文件系統以替換數組,同時忘記設置“保留硬連結和符號連結”標誌,並得到以前顯然只是連結的副本,然後隨著時間的流逝,它們實際上是原件。(嘗試使用 20 年的照片/影片以及 30 年的其他數據來獲得更好的結果!)有時,我的現場工作流程(儘管定義明確並經過測試)會導致各種文件夾的狀態不確定,因此我會製作更多備份副本以“以防萬一”。我還曾經編寫過創建數千個文件夾符號連結的程序,以便以不同的方式查看我龐大的文件夾結構。(就像文件系統的“數據透視表”。)但後來 rsync’ed 整個文件系統以替換數組,同時忘記設置“保留硬連結和符號連結”標誌,並得到以前顯然只是連結的副本,然後隨著時間的流逝,它們實際上是原件。(嘗試使用 20 年的照片/影片以及 30 年的其他數據來獲得更好的結果!)所以我製作了更多的備份副本“以防萬一”。我還曾經編寫過創建數千個文件夾符號連結的程序,以便以不同的方式查看我龐大的文件夾結構。(就像文件系統的“數據透視表”。)但後來 rsync’ed 整個文件系統以替換數組,同時忘記設置“保留硬連結和符號連結”標誌,並得到以前顯然只是連結的副本,然後隨著時間的流逝,它們實際上是原件。(嘗試使用 20 年的照片/影片以及 30 年的其他數據來獲得更好的結果!)所以我製作了更多的備份副本“以防萬一”。我還曾經編寫過創建數千個文件夾符號連結的程序,以便以不同的方式查看我龐大的文件夾結構。(就像文件系統的“數據透視表”。)但後來 rsync’ed 整個文件系統以替換數組,同時忘記設置“保留硬連結和符號連結”標誌,並得到以前顯然只是連結的副本,然後隨著時間的流逝,它們實際上是原件。(嘗試使用 20 年的照片/影片以及 30 年的其他數據來獲得更好的結果!)同時忘記設置“保留硬連結和符號連結”標誌,並以以前顯然只是連結的副本結束,然後隨著時間的推移失去了實際上是原件的踪跡。(嘗試使用 20 年的照片/影片以及 30 年的其他數據來獲得更好的結果!)同時忘記設置“保留硬連結和符號連結”標誌,並以以前顯然只是連結的副本結束,然後隨著時間的推移失去了實際上是原件的踪跡。(嘗試使用 20 年的照片/影片以及 30 年的其他數據來獲得更好的結果!)
換句話說,我到處都有數以百萬計的大文件,其中大部分都是不必要的冗餘,一團糟。我需要修復它。不僅僅是為了節省空間(早已被照顧),而是為了減少安全(更重要的是規範)在哪裡的混亂。對我來說,第一步是刪除數千個文件夾,這些文件夾的內容我非常自信(不一定確定)100% 分佈在其他地方。即使每個刪除候選者都需要快速手動驗證。
它正在生成初始列表,這在人類一生中是不可能的。理想情況下,該列表將是“此目錄中的所有文件都存在於其他地方,但在不同的目錄佈局中,這些目錄也包含不匹配的文件”。但至少,“此目錄中的所有文件也存在於其他地方”。
我已經研究並測試了十幾種重複數據刪除解決方案,其中一些解決方案非常接近於解決這個問題,但還不夠接近。我的“永久”陣列多年來一直啟用內聯 ZFS 重複數據刪除。即使它將寫入吞吐量降低到大約 25%,我也可以等待——但我無法承受數十年兩次甚至三次重複照片所需的數千美元額外驅動器空間和影片數據(更不用說儲存在三向鏡像條帶上)。
我剛剛配置了一個本地自動備份陣列(以補充雲備份)。我選擇了 Btrfs RAID1 以避免同時使用具有相同錯誤的相同儲存軟體的潛在問題。(我以前在使用 ZFS 時也遇到過這種情況,幸好只是暫時無法掛載。)此外,該解決方案還具有能夠輕鬆擴展或擴展陣列的美妙特性,一次只有一個磁碟。:-),這很好,因為在我的大型主 ZFS 陣列上這是一個非常昂貴且耗時的提議。
無論如何,與該問題相關的唯一原因是 Btrfs 具有大量用於離線重複數據刪除的良好實用程序,正如我所說,其中一些非常接近解決這個問題,但還不夠。我嘗試過的快速總結:
- rdfind:快速匹配算法,非常適合通過硬連結進行重複數據刪除。問題是,這可能會給任何使用者(所有使用者?)帶來災難。雖然對於我在大型冗餘媒體文件之間節省空間的明顯獨立要求(無論名稱或位置如何)來說部分是可以的,但我發現這對於其他不容易解開的事情來說是災難性的。例如,它還將其他相同的文件硬連結在一起,這些文件沒有同一個文件的業務。例如作業系統和應用程序自動生成的各種元數據文件,其中大部分在數百或數千個目錄中是相同的,但絕對必須能夠不同。例如“Thumbs.db”,並且引用同一個文件可以而且幾乎肯定會導致以後失去數據——可能是微不足道的,也可能不是。
- duperemove:使用 Btrfs 重新連結進行重複數據刪除,因此這是一種可以接受的(非常好的,甚至是)方法,可以節省磁碟空間,同時允許文件稍後分流。(除了目前 Btrfs 在碎片整理時顯然會取消重複文件$$ depending on the kernel? $$,甚至快照。多麼可怕的怪癖,但我通過從不進行碎片整理和接受後果來避免它。) duperemove 的問題在於,由於它會盲目地校驗搜尋中的每個文件,因此速度非常慢,並且磁碟工作時間長而困難。它基本上執行窮人的陣列擦洗。我的陣列需要幾天時間。(bedup、bees 和其他一些在這方面是相似的,即使在其他方面非常不同。rdfind 和其他一些更聰明。他們首先比較文件大小。然後是前幾個字節。然後是最後幾個字節。只有當所有這些都匹配時,它是否求助於校驗和。)
- rmlint:目前這似乎最適合我節省磁碟空間的其他要求。它有兩個用於 Btrfs 重新連結的選項(核心模式原子複製和稍微不那麼健壯的 ‘cp –reflink’ 方法)。掃描算法是我測試過的最快的;散列可以提高到 sha256 或更高(包括逐位);它有許多有用的選項可以滿足我的許多要求。(據我所知,除了這個問題中的那個。)
還有許多其他重複數據刪除實用程序,包括 fdupes、fslint 等。我已經對它們進行了相當多的測試(或閱讀),即使它們沒有 Btrfs 支持(因為這與這個問題幾乎無關)。除了 rmlint 之外,它們都沒有接近我需要的東西。
您可以使用 fdupes 之類的程序從兩個相同的文件創建指向一個文件的硬連結。這已經有利於節省磁碟空間。
執行此操作後,如果您有一個目錄只包含連結數大於 1 的文件,則您知道每個文件都存在於磁碟上的其他位置。
要查找僅包含連結計數大於 1 的文件的目錄,您可以使用
find
獲取所有目錄的列表,然後再次使用 find 消除包含連結計數為 1 的文件的目錄。此範例不處理文件或目錄名稱中的空格。
for dir in `find . -type d`; do if test -z "$(find $dir -maxdepth 1 -links 1 -quit)"; then echo $dir fi done