rsync의 "대화 상자" 출력을 사용하여 진행률 표시줄 만들기

rsync의 "대화 상자" 출력을 사용하여 진행률 표시줄 만들기

파일 동기화 중에 멋진 진행률 표시줄을 얻을 수 있도록 "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 명령이 있으며, rsync의 출력은 awk로 파이프되고 다음 awk 필터를 사용합니다.

{
   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

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가 있으므로 or 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으므로 문제가 되지 않을 것으로 예상됩니다.

관련 정보