Shell-Script

替換尾隨文本 POSIX-ly

  • December 1, 2019

由於我沒有找到將文件名提供給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

引用自:https://unix.stackexchange.com/questions/555028