なぜなら、ファイル名を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でバイナリファイルとテキストファイルを区別しないため、実際にはこれは必要ありません。