장치 전체 내용의 체크섬을 계산하고 진행률 표시줄을 추가합니다.

장치 전체 내용의 체크섬을 계산하고 진행률 표시줄을 추가합니다.

사용자가 설치된 장치를 선택하고 해당 장치에 있는 모든 데이터의 체크섬을 계산할 수 있는 쉘 스크립트를 만들고 싶습니다. 다른 사람이 장치를 조작했는지 테스트하려면 체크섬이 필요합니다. 내 접근 방식은 다음과 같습니다.

#!/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- 진행 상황을 시각적으로 표시하지 않고 대신 pv한 줄에 하나씩 표준 오류의 정수 백분율을 제공합니다.
  • 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)"

관련 정보