파일 그룹을 처리하고 다양한 유형의 작업을 수행할 수 있는 스크립트가 있다고 가정해 보겠습니다.
작업하면서 파일 이름을 인쇄하면 상황이 어떻게 진행되는지 추적하는 데 도움이 됩니다.
그러나 데이터의 양은 스크립트가 어느 단계에 있는지와 같은 다른 정보를 압도할 수 있습니다.
내가 원하는 것은 stdin을 읽고 줄 바꿈을 상자 반환 및 termcap 시퀀스로 변경하여 줄 끝까지 내용을 지우는 것입니다. (또는 리턴, 간격의 최종 너비 및 또 다른 리턴)
이 기능을 사용하면 다양한 단계의 출력이 스크롤 없이 변경되는 단일 줄로 표시됩니다(줄 바꿈이 없는 한. 아, 한 번에 한 질문씩).
이것을 작성할 수는 있지만 누군가가 이전에 해본 적이 있을 만큼 유용해 보이지만 필터 이름이 무엇인지 모르겠습니다.
이미 마쳤어?
someprogram | dialog --progressbox 1 80
( 내가 찾고 있는 것과 가까운 것을 사용함 )
답변1
당신이 원하는 것은 스크롤 없이 계속 업데이트되는 진행 라인을 갖는 것이라고 생각합니다. 이에 대해 제가 쓴 내용은 다음과 같습니다.
files="$(ls /some/folder)"
elems="$(echo "$files" | wc -w)"
cnt=0
for name in $files; do
let "cnt+=1"
printf "\rMyScript - Processing file %3i of %3i: %.40s" "$cnt" "$elems" "$name"
done
echo
예를 들어 행이 제공됩니다 MyScrpit - Processing file 5 of 14: foo.a
.
다음과 유사하게 파이프라인을 통해 작동하도록 수정할 수도 있습니다 dialog --progressbox
.
total="$1"
cnt=0
while IFS='$\n' read -r name; do
let "cnt+=1"
printf "\rProcessing file %3i of %3i: %.40s" "$cnt" "$total" "$name"
done < /dev/stdin
echo
물론, 카운터를 생략하고 파일 이름만 인쇄할 수 있습니다(총 개수를 인수로 미리 제공하고 싶지 않은 경우).
printf의 고정 필드 길이는 줄바꿈되지 않도록 보장합니다(터미널 창이 더 작지 않은 한).