파일 동기화 중에 멋진 진행률 표시줄을 얻을 수 있도록 "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
으므로 문제가 되지 않을 것으로 예상됩니다.