[Linux 셸 스크립트] 사용자 인터페이스 - 010 파일 압축 시 실행 상태를 표시하는 진행바 표시하기
본문 바로가기
IT 이야기/Linux 셸 스크립트

[Linux 셸 스크립트] 사용자 인터페이스 - 010 파일 압축 시 실행 상태를 표시하는 진행바 표시하기

by 찬찬이 아빠 2021. 3. 4.
반응형
  1. 사용 명령어

(1) pv

(2) tar

(3) gzip

 

 

  2. 키워드 & 사용처

(1) 키워드

압축, 진행바

 

(2) 사용처

시간이 오래 걸리는 파일 처리 등에서 화면에 진행 상태를 나타내고 싶을 때 사용합니다.

 

  3. 실행 예제
$ ./tar-pv.sh
 693MB 18:30:32 [16.4MB/s] [              <=>                ]

 

 

  4. 스크립트

#!/bin/sh

 

DATA_DIR=myapp/datadir

 

cd $DATA_DIR             

tar cvf - bigfile1.data bigfile2.dat | pv | gzip > archive.tar.gz     

 

 

  5. 해설

이 스크립트는 tar 명령어와 gzip 명령어로 큰 파일을 아카이브할 때 처리 진행 상태를 pv 명령어로 표시합니다. tar 명령어로 현재 처리 중인 파일을 표시하려면 다음처럼 v 옵션을 사용합니다. 여기서 c 옵션은 아카이브 작성(Create), f 옵션은 아카이브를 파일로 작성(여기에서는 archive.tar) 한다는 의미입니다.

$ tar cvf archive.tar *.dat
datadir/1001.dat
datadir/1002.dat
datadir/1003.dat
datadir/1004.dat
... 생략 ...

 

출력 결과를 보면 알 수 있듯이 tar 명령어의 v 옵션은 파일마다 표시되므로 큰 아카이브 파일 경우에는 현재 처리가 진행되고 있는지 아니면 멈췄는지 알기 어렵습니다. 이럴 때 쓰는게 pv 명령어입니다.

 

pv 명령어는 Pipe Viewer 약어로 파이프 처리 중데이터 흐름을 가시화합니다.

pv 명령어에서 쓰는 주요 옵션은 아래와 같습니다.

옵션 의미
-a 진행바가 아닌 파이프에 흐르는 데이터의 평균 속도를 표시
-b 처리를 바이트 숫자만 표시하며 진행바는 표시하지 않음
-L 파이프 전송량을 제한. 초당 전송량은 k(킬로0, m(메가), g(기가) 단위의 바이트 수로 지정
-q 조용한(quiet)모드. -L로 전송량 제한만 하고 싶을 때 사용
-s 파이프에 흐르는 데이터 크기를 미리 지정. 이것으로 100% 진행바를 표시

 

예제는 우선 에서 셸 변수 DATA_DIR로 지정한 디렉터리로 이동합니다. 이 디렉터리에는 무척 큰 데이터 파일인, bigfile1.data와  bigfile2.dat가 있습니다. 에서 파일을 합쳐서 tar.gz 형식으로 아카이브합니다. tar 명령어 인수에 -(하이픈)이 있는데 이것은 명령어 출력을 파일이 아닌 표준 출력으로 보내겠다고 지정하는 것입니다.

 

따라서 tar 아카이브된 데이터 열은 파이프로 pv 명령어에 그대로 전달됩니다. pv 명령어는 처리 상태를 표준 에러 출력에 표시하면서 동시에 파이프 접속 대상인 gzip 명령어에 데이터 열을 넘깁니다. gzip 명령어는 표준 입력의 tar 아카이브를 받아서 gzip 압축을 해서 archive.tar.gz라는 파일에 출력합니다.

 

pv 명령어 기본 표시는 다음과 같습니다. 그 외에도 전송량 제한(-L) 같은 다양한 옵션이 있으므로 man pv로 확인 합니다.

700MB 18:10:11 [16.4MB/s] [                 <=>                  ]

700MB : 파이프 처리한 데이터 크기
18:10:11 : 처리 시간
16.4MB/s : 평균 속도
[  <=>  ] : 진행바

 

이렇듯 pv 명령어표준 입력을 그대로 출력하면서 처리 결과를 표준 에러 출력에 순차적으로 알기 쉽게 표시하는 기능입니다. '데이터 흐름을 가시화하는 cat 명령어'라고 생각하면 이해하기 쉽습니다.

 

 

<주의사항>

pv 명령어를 써서 전송량을 제한하려면 -L 옵션을 이용합니다. dd 명령어를 사용해서 out.dat라는 1GB 파일을 만들 때 다른 프로세스에 영향을 주지 않도록 처리 속도를 제한하려면 다음과 같이 작성합니다.

dd if=/dev/zero count=1024 bs=1024000 | pv -L 10m -s 1g > out.dat

 

pv 명령어 옵션으로 -L 10m을 지정하면 dd 명령어 결과 1초간 최대 10MB까지 out.dat 파일에 출력됩니다. 또한 -s 1g 옵션으로 처리해야 할 총 크기가 1GB라는 걸 명시적으로 지정합니다. 이걸로 진행바가 100%까지 차오르게 표시됩니다.

 

 

<pv 명령어 설치 방안>

리눅스는 pv 명령어는 yum 명령어로 간단히 설치할 수 없습니다. Mac OS X도 pv 명령어는 기본 설치되지 않으므로 따로 설치해야 합니다.

따라서 개발 환경을 준비하고 pv 명령어 소스 코드를 내려받아서 시스템에 설치해야 합니다.

 

ㅇ1. 개발 환경 준비

소스 코드에서 설치하려면 소스 코드를 실행 가능한 형태로 변환(컴파일)하기 위한 개발 환경을 미리 준비해야 합니다. 구체적으로는 gcc명령어와 make 명령어가 필요합니다.

 

리눅스에서 이런 명령어는 특별한 이유로 설치하지 않는 설정(최소 구성을 지정하는 경우)이 아닌 이상 대부분 기본 설치됩니다. gcc 명령어나 make 명령어에 --version 옵션으로 명령어를 실행하면 버전 정보가 표시되므로 이것으로 해당 명령어가 설치되어 있는지 확인할 수 있습니다.

$ gcc --version
gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO warrant; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ make -version
GNU Make 3.82
Built for x86_64-redhat-linux-gnu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

 

여기서 "command not found" 에러가 표시되면 패키지에서 명령어를 설치하기 바랍니다. 리눅스(CentOS)라면 yum 명령어를 사용합니다.

# yum install gcc
# yum install make

Free BSD는 gcc와 make가 기본 설치되어 있습니다.

Mac은  개발 환경을 이용하기 위해 Xcode라는 애플이 배포하는 개발자 도구를 설치해야 합니다.

 

Xcode를 설치할 때 버전에 따라서는 Command Line Tools를 선택하지 않으면 gcc나 make 명령어를 사용하지 못할 수도 있습니다. 그럴 때는 Xcode 설치 후 메뉴의 Preferences > Downloads에서 Command Line Tools를 추가 설치하기 바랍니다.

 

 

ㅇ2. 다운로드

pv 명령어 소스 코드는 아래 주소에서 다운로드 가능합니다.

http://www.ivarch.com/programs/pv.shtml

 

이 웹페이지의 Downloads에 소스 코드 링크가 있습니다. 여러 압축 형식이 있지만 여기서는 확장자 .tar.gz를 내려받습니다. 여러가지 버전이 있는데 최신 버전을 다운로드 합니다.

 

파일 내려받기는 curl 명령어를 사용하면 좋습니다.

$ curl -O http://www.ivarch.com/programs/sources/pv-버전.tar.gz

 

curl 명령어는 기본값이면 표준 출력으로 다운로드한 파일을 표시하므로 -O 옵션을 사용해서 파일로 저장하기 바랍니다.

 

FreeBSD는 curl 대신에 표준 설치된 fetch 명령어를 이용합니다.

$ fetch http://www.ivarch.com/programs/sources/pv-버전.tar.gz

 

 

ㅇ3. 설치하기

다운로드한 pv-버전.tar.gz 파일은 gzip 형식으로 압축된 tar 아카이브입니다. 따라서 우선 tar 명령어로 풀어줍니다.

$ tar xvzf pv-버전.tar.gz
pv-1.4.12/
pv-1.4.12/doc
pv-1.4.12/doc/INSTALL
pv-1.4.12/doc/PACKAGE
pv-1.4.12/doc/spec.in
pv-1.4.12/doc/VERSION
... 생략 ...

 

이제 소스 코드를 컴파일 합니다. 우선 소스 코드에 포함된 configure 스크립트를 이용해서 Makefile을 작성합니다 .이어서 소스 코드를 make 명령어로 컴파일 합니다. 마지막으로 실행 파일을 make install로 시스템에 설치합니다. make instaa 명령어는 root 권한으로 실행해야 합니다.

$ cd pv-1.4.12
$ ./configure
$ make
$ su
Password : root 암호 입력
# make install

 

Mac은 마지막에 sudo make install로 실행합니다.

 

configure와 make는 일반 사용자로 실행하고, make install만 root 권한으로 실행하는 것은 실수로 시스템 전체에 문제가 생기는 것을 막기 위함입니다. 이것은 관습적인 것이지만 소스 코드에서 설치하는 절차로 생각하면 됩니다.

 

설치할 곳의 기본값은 /usr/local 입니다. 이것은 configure 할 때 --refix 옵션으로 변경할 수 있습니다.

$ ./configure --prefix=$HOME/local

 

이렇게 하면 홈 디릭터리 아래에 있는 local 디렉터리에 설치됩니다. 그러면 make install 할 때 root 권한이 필요하지 않으므로 테스트용으로 홈 디렉터리에 설치하는 것도 좋습니다.

 

 

ㅇ4. 설치 확인

make install로 pv 명령어가 설치되면 --version 옵션을 지정해서 명령어를 실행해봅니다.

$ pv --version
pv 1.4.12 - Copyright(C) 2012 Andrew Wood <andrew.wood@ivarch.com>

Web site : http://www.ivarch.com/programs/pv.shtml

This program is free software, and is being distributed under the terms of the Artistic License 2.0.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without enen the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 

이렇게 버전 정보가 표시되면 제대로 설치된 것입니다.

 

만약 "command not found"가 표시되면 설치되지 않은 상태입니다.

$ pv
-bash: pv: command not found

 

설치할 때 --prefix 옵션으로 홈 디렉터리 아래에 있는 디렉터리를 지정해서 설치했으면 경로가 설정되지 않아서 에러가 발생할 수도 있습니다. 그럴 때는 pv 명령어를 전체 경로로 지정해서 실행하기 바랍니다.

$ /home/park/local/bin/pv --version

홈 디렉터리 아래에 설치했으면 셸 스크립트에서도 pv 명령어는 전체 경로로 실행해야 하므로 주의하기 바랍니다.

 

 

 

 

참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전

반응형

댓글