有很多關于比較兩個檔案夾的哈希值的問題和答案,比如這個。假設我有一個復制到備份介質(外部驅動器、閃存、光碟)的檔案夾,并想洗掉原始檔案夾以節省空間。
什么是最好的方法?
什么是最好的方法來保存原始檔案夾的哈希值(在洗掉之前)在一個文本檔案中,并在很久之后根據該檔案檢查備份的完整性。
uj5u.com熱心網友回復:
注意,如果你先洗掉原件,然后發現備份缺乏完整性,可以這么說,你只知道出了問題;未被破壞的資料將消失。
你可以創建一個 CSV 檔案,其中有兩列,
RelativePath(相對于輸入目錄的完整檔案路徑)和Hash,并通過Export-Csv將其保存為一個 CSV 檔案:
$inputDir = 'C:path odir' # Note: specify a *full* path.
$prefixLen = $inputDir.Length 1
Get-ChildItem -File -Recurse -LiteralPath $inputDir !
獲取檔案哈希值|
選擇-物件 @{
Name={span class="hljs-string">'RelativePath'}。
Expression={ $_.Path.Substring($prefixLen) }.
},
哈希值|
Export-Csv originalHashes.csv -NoTypeInformation -Encoding utf8
注意。在PowerShell (Core) 7 中,既不需要-NoTypeInformation,也不需要-Encoding utf8,不過請注意,檔案將沒有UTF-8BOM。如果你想要一個,請使用-Encoding utf8bom;反之,在Windows PowerShell中,你無一例外地得到一個BOM。
注意:
Microsoft.PowerShell.Commands.FileHashInfo實體由Get-FileHash也有一個.Algorithm屬性,命名所使用的散列演算法(默認為'SHA256',或通過-Algorithm引數指定)。
如果你想包括這個屬性(它的值對所有CSV行都是一樣的),你只需將Algorithm添加到上面傳遞給Select-Object的屬性陣列中。
注意hashtable(@{ ... })如何作為第二個屬性引數傳遞給Select-Object作為calculated property,從每個.Path屬性值(包含full路徑)匯出相對路徑。
稍后你可以對backup目錄樹應用同樣的命令,保存到,比如說,backupHashes.csv,并通過Compare-Object比較這兩個CSV檔案:
Compare-Object (Import-Csv -LiteralPath originalHashes.csv) `。
(Import-Csv -LiteralPath backupHashes.csv) `。
-Property RelativePath, Hash
注意:在操作中沒有嚴格的需要涉及files - 一個或兩個輸出集合可以在記憶體中捕獲,并可以直接用于比較 - 只要在上面的命令中省略Export-Csv呼叫,并保存到一個變數($originalHashes = Get-ChildItem ...)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/332623.html
標籤:
