Watch at Ease看見世界,讀懂生活。

科技 · 實用指南

在 Linux 上只取 File History 的最新檔案版本

在 Linux 上,從可讀取的 Windows File History 資料夾建立僅含最新版本的副本,依檔名中的 UTC 時間戳記選取,並將不同檔案分開處理。

原創示意圖呈現 Work/report.pdf 的三個已儲存版本,依檔名中的 UTC 時間戳記選取最新版本,並使用選用的 --restore-names 設定,另外建立名為 Work/report.pdf 的副本。
原創解說示意圖:從三個已儲存版本中選取最新的一個。圖中輸出使用選用的 --restore-names;預設輸出的檔名會保留 UTC 時間戳記。所有來源版本仍保留在備份中。 Watch at Ease

Windows File History 資料夾可能包含同一份文件的多個已儲存版本,每個檔名都附有 UTC 時間戳記。若要只取各檔案的最新副本,應依原始目錄及完整檔名將版本分組,再比較這些已儲存的時間戳記。Linux 列出檔案的順序不能可靠地取代這項比較。

下方的輔助程式會另外建立一份僅含最新版本的副本。它不會改寫或刪除來源檔案,預設的預覽操作也不會建立任何輸出檔案。套用選取結果時,程式會將選定的檔案複製到新的輸出目錄;它不會刪除備份中的舊版本,也不會釋放那些版本占用的空間。

先確認手上的資料

先找到可讀取、且包含已儲存檔案本體的資料夾。例如,Report (2024_05_03 09_30_00 UTC).docx 是支援的檔名格式;同一目錄中較晚的 Report (2024_05_08 16_15_00 UTC).docx 屬於同一組。請將輔助程式指向要處理的子目錄樹,不要假設每個名為 FileHistory 的資料夾都包含這種可辨識的檔名。

保留完整的原始備份。處理大型目錄樹前,先瀏覽幾個檔案,確認它們能正常開啟。如果磁碟無法掛載、檔案無法讀取,或檔名只是無法辨識的識別碼,就不適合接著使用這個輔助程式。它無法從 File History 目錄資料庫重建原始路徑,也無法找回已不存在的檔案內容。

不要只因檔名看起來相似,就把不同使用者或不同電腦的備份合併到同一資料夾。請選取要處理的可讀取子目錄樹,保留其中的目錄結構,並另外處理其他備份。這個流程不能證明不同備份中名稱相同的兩份文件就是同一個原始檔案。

了解程式會選取哪個版本

在同一目錄內,輔助程式會解析完整原始檔名相同的各個版本,並比較它們附帶的 UTC 時間戳記。Report.docx 和 Report.pdf 是不同組;Documents/Report.docx 和 Archive/Report.docx 也是不同組。副檔名與所在目錄都是檔案識別資訊的一部分。

將檔案複製到另一顆磁碟,可能會改變檔案系統的時間戳記。程式不會用那些時間戳記決定選取結果,也不會選擇目錄掃描時碰巧最後出現的版本:Python 文件指出,目錄遍歷取得的清單不一定已排序。預期選取的是每個支援群組中,已儲存 UTC 值最大的版本。

下載輔助程式並選擇路徑

在 Linux 開啟終端機,檢查 Python 版本:

python3 --version

請使用 Python 3.10 或更新版本。將 filehistory-latest-v1.py 儲存到工作資料夾,再於該資料夾開啟終端機。如果已安裝 curl,可用下列指令下載原始碼檔案。這條指令只會儲存指令碼,不會執行它。

curl --fail --location "https://watchatease.com/guide-tools/filehistory-latest-v1.py" --output "filehistory-latest-v1.py"

以下範例將 FileHistory-copy/Documents 作為來源子目錄樹,並在 FileHistory-copy 旁建立名為 latest-documents 的新輸出資料夾。請把來源改成實際路徑。路徑若含空格,請保留兩側的引號。輸出目錄必須尚未存在,而且來源與輸出不可互相包含:不要將輸出放在來源內。

複製前先預覽選取結果

請暫停所有會寫入這個來源子目錄樹的備份作業,並從預覽開始到複製結束,都避免變更其中的檔案。這個流程不會在同一瞬間擷取所有檔案。先執行不含 --apply 的指令:

python3 "filehistory-latest-v1.py" --source "./FileHistory-copy/Documents" --output "./latest-documents"

輔助程式會在終端機顯示 JSON 預覽,不會建立輸出目錄。預覽不會讀取檔案內容或計算其雜湊值,因此預覽成功不代表之後一定能複製每個檔案。繼續之前,請閱讀路徑與選取資訊。檢查一個你熟悉、且有多個已儲存版本的檔案、兩個主檔名相同但副檔名不同的檔案,以及位於不同目錄的同名檔案。

不符合支援時間戳記格式的一般檔案,會在報告中列為略過,不會複製到僅含最新版本的結果中。略過的檔案仍可能對你有用,請檢查這些項目,並視需要另外保留或複製;不要把結果當成來源底下所有內容的完整副本。

無效的 UTC 時間戳記、符號連結、特殊檔案或讀取失敗,都會阻止作業執行。如果最新時間戳記出現無法判定的並列情況,也需要檢查。請查明報告所列路徑的狀況,不要為了通過檢查就改寫不明日期,或任意選擇其中一個並列檔案。完全找不到支援檔案的作業也會被阻止:請確認選取的是含有時間戳記檔案的資料子目錄樹。

將最新版本複製到新目錄

確認預覽顯示的正是要收集的檔案後,重新執行同一條指令,並加上 --apply:

python3 "filehistory-latest-v1.py" --source "./FileHistory-copy/Documents" --output "./latest-documents" --apply

輸出包含 files 目錄、manifest.csv 和 summary.json。所選檔案會保留相對目錄結構,預設也會保留儲存時附帶時間戳記的檔名,讓你看出選中了哪個版本。原始備份中的舊版本仍會保留。輔助程式複製的是檔案內容,不會保留原本的權限、ACL 或檔案系統時間戳記。

如果希望結果使用原始檔名,可加上 --restore-names。這只是檔名上的便利選項,不會改變選取哪個時間戳記的規則。套用之前,請先使用另一個尚未使用的輸出路徑,預覽這個選項的結果:

python3 "filehistory-latest-v1.py" --source "./FileHistory-copy/Documents" --output "./latest-documents-original-names" --restore-names

python3 "filehistory-latest-v1.py" --source "./FileHistory-copy/Documents" --output "./latest-documents-original-names" --restore-names --apply

使用結果前先檢查

閱讀 summary.json,並使用文字編輯器或試算表檢視器查看 manifest.csv。複製完成時,status 應為 complete,且不應有 _INCOMPLETE.txt 標記檔。在清單中,可用 source_relative_path 和 output_relative_path 追溯每個已複製檔案,以 version_utc 檢查所選日期,並用 sha256 查看記錄的內容雜湊值。將 copied、older_version 和 unmatched 項目與各項總數及任何錯誤報告比對。

輔助程式使用 SHA-256 雜湊值檢查複製後的檔案內容。雜湊值相符,可支持副本的位元組與所選來源檔案一致;這不能證明所選檔案原本就是完整或未損壞的,也不能證明備份包含你預期的每一份文件。

使用平常的應用程式,開啟幾份輸出文件、圖片或其他檔案。檢查範圍應包括重要檔案、有多個版本的檔案,以及不同目錄中的檔案。挑一個你熟悉的群組,將選定的時間戳記與來源中現有版本比對。如有遺漏或非預期結果,請先回頭檢查預覽與來源檔案,再判斷結果是否完整。

如果目的是釋放磁碟空間,請記得這個流程並未清理原始備份。先驗證僅含最新版本的副本,再另外決定如何保留原備份及舊版本。那些版本日後可能還有用途;不要只因建立了新資料夾,就刪除它們。

指令未能完成時

如果 Python 找不到指令碼,請檢查終端機目前所在的資料夾,或提供指令碼的完整路徑。如果找不到來源,請使用可讀取備份實際掛載的位置。Windows 磁碟機代號不會自動成為可用的 Linux 路徑。

如果輸出已存在,請改選另一個尚未使用的輸出目錄。不要將下一次作業指向已有內容的結果,並期待程式更新或合併它。套用時應保留預覽所用的選項,包括你已選用的 --restore-names。如果還原檔名會讓某個檔案與目錄衝突,請檢查該目錄配置,或改用預設保留時間戳記的輸出檔名。

預覽或前置檢查失敗時,程式會回傳錯誤,不會建立輸出目錄。複製途中失敗則可能留下部分輸出、_INCOMPLETE.txt,以及狀態為 failed 或 in_progress 的摘要。如果連報告也寫入失敗,summary.json 或 manifest.csv 可能不存在。終端機出現錯誤、仍有未完成標記,或缺少完成證據,都應視為執行未成功。修正報告所列原因後,重新預覽,再套用到另一個新的輸出目錄。

調查問題時,請將未完成的目錄另外保留;輔助程式不會自動刪除它。不要把其中的檔案與後續作業混在一起,並將混合結果當成已驗證。請使用同一次已完成作業的清單與摘要,開啟並檢查它的檔案後,再決定要保留哪些內容。

了解最新版本集合的限制

每個群組提供的是現有備份中最新的已儲存版本,而這些版本可能來自不同日期。因此,這個集合不是電腦在某個特定時刻的快照。原電腦已刪除的檔案,仍可能在備份中留有副本,也可能出現在這次結果中。

已缺失的舊版本、不符合支援格式的檔名、僅存在目錄資料庫中的資訊,以及無法辨識的儲存路徑,都不在這個選取流程的處理範圍內。輔助程式不會推斷刪除紀錄、重建那些路徑,也不會判定無法辨識的檔案可以丟棄。

如果能使用 Windows,而且需要 File History 按日期逐次還原的功能,Microsoft 已提供原生操作方式的文件。另一種既有做法是 WindowsFileHistoryCleaner,它已提供最新版本選取與預覽模式。Mono 支援廣泛的 .NET 功能,但本指南並未聲稱已驗證該專案在 Linux 上的具體設定。本流程的範圍明確限於前述可讀取、帶有時間戳記的檔案。

原創示意圖將 Work/report.txt、Work/report.pdf 和 Home/report.txt 分為三個不同的版本群組,各自使用選用的 --restore-names 設定,產生最新版本的副本。
原創解說示意圖:依相對目錄與完整原始檔名分組,副檔名也包含在內。圖中副本使用選用的 --restore-names;預設輸出會保留所選版本附帶 UTC 時間戳記的檔名。 Watch at Ease