デバイス全体の内容のチェックサムを計算し、進行状況バーを追加します。

デバイス全体の内容のチェックサムを計算し、進行状況バーを追加します。

ユーザーがインストールされているデバイスを選択し、そのデバイス上のすべてのデータのチェックサムを計算できるシェルスクリプトを作成したいと思います。他の人がデバイスを操作したかどうかをテストするには、チェックサムが必要です。私のアプローチは次のとおりです。

#!/bin/bash
cd "${0%/*}"



device=$(zenity --file-selection --directory \
--filename="/run/media/"${USER}"/"


zenity --info \
--title "Info Message" \
--width 500 \
--height 150 \
--text "$(find "$device" -type f -exec md5sum {} \; | sort -k 2 | md5sum | cut -d ' ' -f 1)"

私の質問は次のとおりです

  1. これは正しいアプローチですか?
  2. デバイス選択と計算出力ダイアログの間に進行状況バーを追加するには?

答え1

あなたはそれを使用することができますpvこれにより、パイプラインを介してデータの進行状況を監視できます。

find "$device" -type f -exec md5sum {} \; | pv -ls $(find "$device" -type f |wc -l) | sort -k 2 | md5sum
  • -s <size>データの合計サイズを提供します。ファイルの数に応じて進捗状況を表示したいので、デバイスにいくつかのファイルがあるかどうかを知る必要があります$(find "$device" -type f |wc -l)
  • -l- バイト数を数えるのではなく、行数(改行)数を計算します。

最初のfindコマンドは、md5sumの結果をこのpvコマンドに送信します。pv完了率(入力行数をフラグが提供する合計サイズで割った値-s)を計算し、端末の標準エラーをダイアログボックスに記録し、入力(最初のコマンドの結果find)を次のコマンドに送信します。対応するコマンドコマンドパイプライン(この場合sort)。

$ find "$device" -type f -exec md5sum {} \; | pv -ls $(find "$device" -type f |wc -l) | sort -k 2 | md5sum | cut -d ' ' -f 1
6.77k 0:00:10 [1.61k/s] [=========>                            ] 28% ETA 0:00:24

デバイスにファイルが多すぎてファイル数を数えるのに時間がかかる場合は、直接使用できますpv -l。この時点で完了率と到着予定時刻は表示されず、進行状況バーが移動します。左に移動して正しく表示されます。

$ find "$device" -type f -exec md5sum {} \; | pv -l  | sort -k 2 | md5sum | cut -d ' ' -f 1
5.64k 0:00:09 [1.72k/s] [        <=>                                           ]

zenityウィンドウに進行状況バーを表示するには、次のようにします。

find "$device" -type f -exec md5sum {} \; \
| ( ( pv -nls $(find "$device" -type f |wc -l) 2>&1 1>&3 ) \
| zenity --progress --auto-close --text="md5sum progress..." 2>/dev/null ) 3>&1 \
| sort -k 2 | md5sum | cut -d ' ' -f 1
  • -nフラグpv- 進行状況を視覚的に表示するのではなく、1pv行に1つずつ標準エラーの整数パーセントを提供します。
  • 2>&1stderrコマンドの数pv(パーセントカウント)をコマンドのstdout- 数にリダイレクトするので、後者はパーセントカウントを読み取り、進行状況バーを表示できます。stdinzenity
  • 1>&3古いファイルstdout(コマンドの出力find ... md5sum)を新しいファイルディスクリプタ3にリダイレクトして、stdinプロセスのファイルディスクリプタから切り離しますzenity
  • 3>&1コマンド分析の連続であるプロセスのファイル記述子3 pv(コマンドの出力を含むfind)をリダイレクトします。stdoutstdinsort

md5sum別のzenityウィンドウで最終出力を表示するには、次の手順を実行します。

zenity --info \
--title "Info Message" \
--width 500 \
--height 150 \
--text \
"$(find "$device" -type f -exec md5sum {} \; \
| ( ( pv -nls $(find "$device" -type f |wc -l) 2>&1 1>&3 ) \
| zenity --progress --auto-close --text="md5sum progress..." 2>/dev/null ) 3>&1 \
| sort -k 2 | md5sum | cut -d ' ' -f 1)"

関連情報