사용자가 설치된 장치를 선택하고 해당 장치에 있는 모든 데이터의 체크섬을 계산할 수 있는 쉘 스크립트를 만들고 싶습니다. 다른 사람이 장치를 조작했는지 테스트하려면 체크섬이 필요합니다. 내 접근 방식은 다음과 같습니다.
#!/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
- 진행 상황을 시각적으로 표시하지 않고 대신pv
한 줄에 하나씩 표준 오류의 정수 백분율을 제공합니다.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)"