ユーザーがインストールされているデバイスを選択し、そのデバイス上のすべてのデータのチェックサムを計算できるシェルスクリプトを作成したいと思います。他の人がデバイスを操作したかどうかをテストするには、チェックサムが必要です。私のアプローチは次のとおりです。
#!/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
あなたはそれを使用することができます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>&1
stderr
コマンドの数pv
(パーセントカウント)をコマンドのstdout
- 数にリダイレクトするので、後者はパーセントカウントを読み取り、進行状況バーを表示できます。stdin
zenity
1>&3
古いファイルstdout
(コマンドの出力find ... md5sum
)を新しいファイルディスクリプタ3にリダイレクトして、stdin
プロセスのファイルディスクリプタから切り離しますzenity
。3>&1
コマンド分析の連続であるプロセスのファイル記述子3pv
(コマンドの出力を含むfind
)をリダイレクトします。stdout
stdin
sort
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)"