替換尾隨文本 POSIX-ly
由於我沒有找到將文件名提供給
pv
(手冊頁)的直接方法,(除了一個奇怪的-N
開關,它充目前綴,而不是文件名本身),我需要手動編輯通過管道輸出的文本sha512sum
或任何其他 shaXsum,例如:pv -W "$file" | sha512sum -b
我將它儲存在一個變數
sha_output
中,但我想給你一個更純粹的例子,原始程式碼是:sha_output=$( pv -W "$file" | sha512sum -b )
範例雜湊和文本輸出:
2a19f5852ba8f76bd5a67db18539d609baaf3888b27a57181564db01ef6c16812c60e306973edc059221f61bf2ad9f4b4ef5ff09bbcef98e74a27971c67bdc18 *-
期望的輸出:
2a19f5852ba8f76bd5a67db18539d609baaf3888b27a57181564db01ef6c16812c60e306973edc059221f61bf2ad9f4b4ef5ff09bbcef98e74a27971c67bdc18 linuxmint-19.2-cinnamon-64bit.iso
(是的,雜湊和文件名之間有 2 個空格)。
最後,讓我們假設文件名儲存在一個名為
file_name
.解決方案不得包含任何Bashisms,請僅包含可移植(POSIX)解決方案。
在這個答案的幫助下,我整理了以下內容:
printf '%s\n' "${sha_output//\*-/$file_name}"
這在 Bash 下令人驚訝地工作(有點),但 Dash 錯誤消息:
bad substitution
由於 POSIX 沒有定義大括號擴展,因此根據評論,這也就不足為奇了。
假設
$file
是您要替換到校驗和輸出中的單個文件的名稱或路徑名。pv "$file" | sha256sum | { IFS=' ' read sum junk && printf '%s %s\n' "$sum" "$file"; }
管道的最後一部分讀取校驗和以及
sha256sum
第一行上的任何其他輸出,然後列印校驗和,然後是原始文件名。請注意,
sha256sum -b
實際上並不需要 using,因為這些工具在 Unix 上的二進製文件和文本文件之間沒有區別。
由於您已經在變數中擷取命令輸出,因此您可以“擷取並更正”var(POSIXly,是的以破折號執行):
sha_output=$( pv -W "$file" | sha512sum -b) sha_output="${sha_output%\*-} $file"
將
${...%\*-}
刪除尾隨*-
,然後附加一個空格和文件名。實際上,該-b
模式僅在訪問文件時區分二進制模式和文本模式的作業系統(即僅MS-DOS)中有用。因此, 不需要任何-b
選項shaXsum
,星號 (*
) (信號二進制模式)將變成一個空格(信號文本模式)。如果您沒有擷取但想要列印輸出,您可以使用:
$ printf '%s\n' "$(pv "$file" | sha256sum | sed 's/-$//')$file" 2a19f5852 ... a27971c67bdc18 linuxmint-19.2-cinnamon-64bit.iso
或@Kusalananda回答。
所有答案都同樣有效,與 POSIX 兼容且有用。
請注意,以上所有內容並沒有模仿
shaXsum
某些文件名(帶有換行符或斜杠)將使雜湊行以反斜杠開頭的確切行為。如果
file='wo\\rds'
(包含反斜杠)輸出為:$ sha256sum "$file" \f6c94d35691b9c356f7e5072f94d23f127b168cf9b04f0f5b26e0cb1f6ef4414 wo\\rds
請注意,該行以反斜杠開頭,文件名中有問題的字元用反斜杠轉義。
您的命令不會模仿:
$ printf '%s\n' "$(pv "$file" | sha256sum | sed 's/-$//')$file" f6c94d35691b9c356f7e5072f94d23f127b168cf9b04f0f5b26e0cb1f6ef4414 wo\rds