POSIX-ly末尾のテキストの置き換え

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


溶液には何も含まれてはいけません。バシズム、ポータブルのみ(POSIX)解決策を提示してください。

これの助けを借りて回答、以下をコンパイルしました。

printf '%s\n' "${sha_output//\*-/$file_name}"

驚くべきことに、Bashでは(やや)動作しますが、Dashでは次のメッセージでエラーが発生します。

bad substitution

コメントによると、中括弧の拡張はPOSIXによって定義されていないので、これは驚くべきことではありません。

答え1

$fileチェックサム出力に置き換える単一ファイルの名前またはパス名であるとします。

pv "$file" | sha256sum | { IFS=' ' read sum junk && printf '%s  %s\n' "$sum" "$file"; }

パイプラインの最後の部分は、最初の行でチェックサムと他のsha256sum出力を読み取り、チェックサムと元のファイル名を印刷します。

sha256sum -bこれらのツールはUnixでバイナリファイルとテキストファイルを区別しないため、実際にはこれは必要ありません。

答え2

すでに変数にあるコマンド出力をキャプチャしているので、変数を「キャプチャして変更する」ことができます(POSIXly、ダッシュでyesを実行)。

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

または@クサラナンダ答え。

すべての回答は同じように有効で、POSIXに準拠し、便利です。


上記の内容はすべて、shaXsum特定のファイル名(改行またはスラッシュを含む)のためにハッシュ行がバックスラッシュで始まる正確な動作を模倣していません。

バックスラッシュを含む)の場合、file='wo\\rds'出力は次のようになります。

$ sha256sum "$file"
\f6c94d35691b9c356f7e5072f94d23f127b168cf9b04f0f5b26e0cb1f6ef4414  wo\\rds

行はバックスラッシュで始まり、ファイル名に問題がある文字はバックスラッシュにエスケープされていることに注意してください。

あなたの命令は以下を模倣しません。

$ printf '%s\n' "$(pv "$file" | sha256sum | sed 's/-$//')$file"
f6c94d35691b9c356f7e5072f94d23f127b168cf9b04f0f5b26e0cb1f6ef4414  wo\rds

関連情報