rsync 출력에서 ​​"dialog"로 진행률 표시 줄 만들기


16

"dialog --gauge"명령에 입력 할 수있는 방식으로 rsync 출력을 필터링 / 리디렉션하는 방법을 찾고 있으므로 파일 동기화 중에 멋진 진행률 표시 줄을 얻을 수 있습니다. 현재 프롬프트에서만 직접 테스트했지만 (bash) 셸 스크립트 에서이 작업을 수행 할 계획입니다.

인터넷을 둘러보고 비트와 조각을 찾았지만 여전히 작동하도록 할 내용이 없습니다.

(면책 조항 : 이것은 완전히 잘못된 접근법 일 수 있으며 리디렉션 / 파이핑 괴물입니다)

내가 현재 정리 한 것 :

rsync -avz --progress -e "ssh" user@server:/home/user/data/ /home/user/data | awk -f /home/user/rsync.awk | sed 's/\([0-9]*\).*/\1/' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70

먼저 --progress 옵션 인 rsync의 출력이 awk로 파이프되고 followng awk 필터를 사용하는 실제 rsync 명령이 있습니다.

{
   if (index($0, "to-check=") > 0)
   {
        split($0, pieces, "to-check=")
        split(pieces[2], term, ")");
        split(term[1], division, "/");
        print (1-(division[1]/division[2]))*100
}
#   else
#   {
#       print "#"$0;
#   }
   fflush();
}

이것은 rsync 출력을 걸러 내고 다음 형식으로 백분율을 제공합니다.

53.7037
55.5556
57.4074
59.2593
61.1111
62.963

따라서 십진수를 없애기 위해 출력을 sed에 공급합니다.

sed 's/\([0-9]*\).*/\1/'

다음과 같은 결과가 나타납니다.

64
66
68
70
72
74
75
77

이 숫자는 다음과 같이 대화 상자에 파이프됩니다.

dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70 

내가 아는 한 "dialog --gauge"등이 이것을 받아 들여야하지만 갑자기 100 %에 도달 할 때까지 진행률이 0 %로 표시됩니다.

누군가가 올바른 방향으로 나를 가리킬 수 있습니까? 작업 진행률 표시 줄에서 멀리 떨어져 있습니까? 이것을 달성하는 더 좋은 방법이 있습니까?

문안 인사,

크리스 터

편집 : @lynxlynxlynx의 답변을 고려한 후 올바른 명령 줄은 다음과 같습니다.

rsync -avz --progress -e "ssh" user@server:/home/user/data/ /home/user/data \ 
 | awk -f /home/user/rsync.awk \ 
 | sed --unbuffered 's/([0-9]*).*/\1/' \ 
 | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70

1
파이프 라인에서 프로그램이 EOF를 보낼 때까지 무언가 (아마도 awk) 같은 소리가 출력을 버퍼링합니다.
Dunno는

답변:


12
for i in 10 20 30; do echo $i; sleep 1; done | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70

@Shadur가 옳고 버퍼링이 있습니다.

sed스트리퍼를 믹스에 추가하면 범인임을 알 수 있습니다 (0과 30 만 표시).

for i in 10 20 30; do echo $i; sleep 1; done | sed 's/\([0-9]*\).*/\1/' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70

이제 문제가 알려져 있으므로 여러 옵션이 있습니다. 가장 깨끗한 것은 awk수학 또는 문자열 조작으로 백분율을 반올림 / 잘라내는 것이지만 GNU 가 있으므로 sed추가 -u하거나 --unbuffered트릭을 수행해야합니다.

그러나 완전성을 기하기 위해 간단한 테스트 사례는 awk버퍼링도 보여줍니다 .

for i in 10 20 30; do echo $i; sleep 1; done | awk '{print $0}' | sed -u 's/\([0-9]*\).*/\1/' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70 

그러나 당신은 이미 그것을 처리 fflush하므로 문제가 발생하지 않습니다.


와..! 대단히 감사합니다! sed에 --unbuffered를 추가하는 것만 필요했습니다! 시간과 지식을 공유해 주셔서 감사합니다 Shadur & lynxlynxlynx!
chr1573r

최종 명령의 모양이 궁금한 다른 사용자의 경우 : rsync -avz --progress -e "ssh"user @ server : / home / user / data / / home / user / data | awk -f /home/user/rsync.awk | sed-버퍼링되지 않은 's / ([0-9] *). * / \ 1 /'| 대화 상자 --title "My Gauge"--gauge "안녕하세요, 게이지 위젯입니다"20 70
chr1573r

문제 없습니다. 사이트에 오신 것을 환영합니다. :)
Shadur
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.