파일 당 타르 진행률을 볼 수있는 방법이 있습니까?


122

압축하고 싶은 몇 개의 큰 파일이 있습니다. 예를 들어이 작업을 수행 할 수 있습니다

tar cvfj big-files.tar.bz2 folder-with-big-files

문제는 진행 상황을 볼 수 없으므로 시간이 오래 걸리거나 그와 비슷한 것이 무엇인지 전혀 모른다는 것입니다. 사용하면 v적어도 각 파일이 완료되는 시점을 알 수 있지만 파일이 많고 크면 가장 도움이되지 않습니다.

타르가 더 자세한 진행 상황을 보여줄 수있는 방법이 있습니까? 완료율 또는 진행률 표시 줄 또는 남은 예상 시간 등 각 단일 파일 또는 모두 또는 둘 다에 대해

답변:


100

나는 이와 같은 oneliners를 선호합니다 :

tar cf - /folder-with-big-files -P | pv -s $(du -sb /folder-with-big-files | awk '{print $1}') | gzip > big-files.tar.gz

다음과 같이 출력됩니다 :

4.69GB 0:04:50 [16.3MB/s] [==========================>        ] 78% ETA 0:01:21

OSX의 경우 (Kenji의 답변에서)

tar cf - /folder-with-big-files -P | pv -s $(($(du -sk /folder-with-big-files | awk '{print $1}') * 1024)) | gzip > big-files.tar.gz

2
) | $ (AWK) '{$ 1 인쇄}'* 1024 (뒤 -sk / 폴더 포함) : OSX에, 뒤의 정보는 다음의 제품에 폴백 할 필요 -b 인수하지 않습니다
ıɾuǝʞ

4
좋아, 하나의 라이너. 설명 할 수 있습니까? 아니면 어떻게 든 마술처럼 작동합니까?
Kissaki

2
좋아, 나는 그것을 가지고pv $FILE.tgz | tar xzf - -C $DEST_DIR
Krzysztof Szewczyk

1
OS X의 경우 산술 확장을 위해 대괄호 형식을 사용해야했습니다. tar cf - /folder-with-big-files -P | pv -s $[$(du -sk /folder-with-big-files | awk '{print $1}') * 1024] | gzip > big-files.tar.gz이렇게 변경하지 않으면 다음과 같은 결과가 나타납니다.-bash: syntax error near unexpected token ')'
Dean Becker

1
du 명령이 완료 될 때까지 진행률이 표시되지 않으며 디렉토리의 크기, 복잡성 및 조각화에 따라 시간이 걸릴 수 있습니다.
Rooster242

75

이것을 달성하기 위해 pv 를 사용할 수 있습니다 . 진행 상황을 올바르게보고하려면 pv얼마나 많은 바이트를 처리해야하는지 알아야합니다. 따라서 첫 번째 단계는 크기 (KB)를 계산하는 것입니다. 진행률 표시 줄을 완전히 삭제하고 표시된 pv바이트 수를 알려주십시오. 그것은 '많이 그렇게 빨리 갔다'고보고 할 것입니다.

% SIZE=`du -sk folder-with-big-files | cut -f 1`

그리고:

% tar cvf - folder-with-big-files | pv -p -s ${SIZE}k | \ 
     bzip2 -c > big-files.tar.bz2

시원한. pvMac OS X과 함께 제공되는 것 같지는 않지만 MacPorts가 설치된 컴퓨터가 있으면 시도해보십시오. 당신이 거기서 무엇을하고 있는지 설명해 주시겠습니까? 첫 번째 줄이 정확히 무엇인지 확실하지 않습니다.
Svish

4
첫 줄 : 처리 될 바이트 수에 대한 정보를 가져옵니다. 두 번째 줄 : 첫 번째 줄의 크기를 사용하여 pv가 '진행'을 렌더링하도록합니다. 데이터를 파이핑하고 있기 때문에 pv는 얼마나 많은 바이트가 올지 알 수 없습니다.
akira

한 가지 추가 사항 : SIZE=$(($SIZE * 1000 / 1024))-이것이 특정 플랫폼의 기발한 지 여부를 알 수 없으므로 답변에 추가하지 않습니다 : du1 kb = 1024 바이트의 크기를 반환하지만 pv1 kb = 1000을 기대 하는 것 같습니다 바이트. (우분투 10.04에있어)
Izkata

2
@lzkata 당신은 항상 질문을 할 수있어 du예를 들어 원하는 블록 크기를 사용하는 것 du -s --block-size=1000, 또는 그냥 일반 바이트 작업, 예를 들어 드롭 k으로부터 '들 dupv통화. 그럼에도 불구하고 1024예 를 들어 --si스위치를 켜는 등 달리 언급하지 않는 한 두 가지를 모두 사용할 것으로 예상 du됩니다.
Legolas

1
또는 k-stuff를 삭제하고 일반 바이트 ( du -sbpv -s수정 자 없음)를 사용하십시오. 모든 혼란을 끝내야합니다.
akira

22

더 나은 진행률 표시 줄 ..

apt-get install pv dialog

(pv -n file.tgz | tar xzf - -C target_directory ) \
2>&1 | dialog --gauge "Extracting file..." 6 50

여기에 이미지 설명을 입력하십시오


2
이것은 추출을 위해 작동하지만 여전히 창조를위한보다 복잡한 명령 중 하나를 수행해야합니다 (원래 질문이었습니다). 여전히 그것들과 결합 될 수 있습니다. 더 복잡합니다.
Daniel H

17

tar 정보 페이지에서 --checkpoint--checkpoint-action옵션을 확인 하십시오 (내 배포판에서 이러한 옵션에 대한 설명은 매뉴얼 페이지 → RTFI에 포함되어 있지 않음).

참조 https://www.gnu.org/software/tar/manual/html_section/tar_26.html를

이것들 (그리고 아마도 자신의 체크 포인트 명령을 작성하는 기능)을 사용하면 백분율을 계산할 수 있습니다 ...


3
이것이 정답이어야합니다. 다른 사람들은 비슷한 도구를 얻기 위해 추가 도구 (기본적으로 설치되지 않음)를 설명합니다.
Carmine Giangregorio

@Sardathrion 아마도 GNU에 tar특정한 것이기 때문일 것 입니다.
phk

11

도우미의 답변에서 영감을 얻음

다른 방법은 기본 tar옵션을 사용하는 것입니다

FROMSIZE=`du -sk ${FROMPATH} | cut -f 1`;
CHECKPOINT=`echo ${FROMSIZE}/50 | bc`;
echo "Estimated: [==================================================]";
echo -n "Progess:   [";
tar -c --record-size=1K --checkpoint="${CHECKPOINT}" --checkpoint-action="ttyout=>" -f - "${FROMPATH}" | bzip2 > "${TOFILE}";
echo "]"

결과는 같다

Estimated: [==================================================]
Progess:   [>>>>>>>>>>>>>>>>>>>>>>>

여기 완전한 예


4

타르 만 사용

tar를 사용하여 신호에 대한 상태 정보를 인쇄하는 옵션 (v1.12부터)이 있습니다 --totals=$SIGNO.

tar --totals=USR1 -czf output.tar input.file
Total bytes written: 6005319680 (5.6GiB, 23MiB/s)

Total bytes written: [...]정보는 모든 USR1 신호, 예를 들어 인쇄됩니다 :

pkill -SIGUSR1 tar

출처:


3

방금 MacOS에 대한 의견을 보았습니다. @ akira (및 pv)의 솔루션이 훨씬 깔끔하다고 생각하지만 MacOS 상자에서 tar를 사용하여 직감과 빠른 해결 방법을 쫓아 SIGINFO 신호를 보내는 것으로 생각했습니다. 재미있게도, 그것은 작동했습니다 :) 만약 당신이 BSD와 같은 시스템이라면, 이것이 작동 해야 하지만 Linux 상자에서는 SIGUSR1을 보내거나 tar같은 방식으로 작동하지 않을 수 있습니다.

단점은 현재 파일에서 얼마나 멀리 있는지 보여주는 출력 (표준 출력) 만 제공한다는 것입니다. 데이터 스트림의 크기가 얼마나 큰지 알지 못하기 때문입니다.

따라서 다른 방법은 타르를 실행하고 얼마나 멀리 도달했는지 알고 싶을 때마다 SIGINFO를 주기적으로 보내는 것입니다. 이것을하는 방법?

임시 수동 접근

임시로 상태를 확인 control-T하려면 SIGINFO 신호를 전송하는 관련 창에서 (Brian Swift가 언급 한대로) 누르십시오. 그것에 대한 한 가지 문제는 그것이 내가 믿는 전체 체인에 그것을 보낼 것이므로, 당신이하고 있다면 :

% tar cvf - folder-with-big-files | bzip2 -c > big-files.tar.bz2

또한 bzip2가 tar와 함께 상태를보고합니다.

a folder-with-big-files/big-file.imgload 0.79  cmd: bzip2 13325 running 
      14 0.27u 1.02s 

      adding folder-with-big-files/big-file.imgload (17760256 / 32311520)

tar실행중인 것이 붙어 있는지 또는 느리게 확인하려는 경우에 잘 작동합니다 . 이 경우 포맷 문제에 대해 너무 걱정할 필요가 없습니다. 빠른 검사일뿐입니다.

자동화 된 접근 방식

시간이 걸리지 만 진행률 표시기와 같은 것을 원한다면 대안은 tar 프로세스를 시작하고 다른 터미널에서 PID를 해결 한 다음 반복적으로 신호를 보내는 스크립트에 던져 넣는 것입니다 . 예를 들어, 다음과 같은 스크립틀릿이있는 경우 (와 같이 말합니다 script.sh PID-to-signal interval-to-signal-at) :

#!/bin/sh

PID=$1
INTERVAL=$2
SIGNAL=29      # excuse the voodoo, bash gets the translation of SIGINFO, 
               # sh won't..

kill -0 $PID   # invoke a quick check to see if the PID is present AND that
               # you can access it..

echo "this process is $$, sending signal $SIGNAL to $PID every $INTERVAL s"
while [ $? -eq 0 ]; do
     sleep $INTERVAL;
     kill -$SIGNAL $PID;    # The kill signalling must be the last statement
                            # or else the $? conditional test won't work
done
echo "PID $PID no longer accessible, tar finished?"

이 방법으로 호출하면 타겟팅하기 때문에 다음 tar과 같은 결과를 얻을 수 있습니다

a folder-with-big-files/tinyfile.1
a folder-with-big-files/tinyfile.2
a folder-with-big-files/tinyfile.3
a folder-with-big-files/bigfile.1
adding folder-with-big-files/bigfile.1 (124612 / 94377241)
adding folder-with-big-files/bigfile.1 (723612 / 94377241)
...

내가 인정하는 것은 꽤 예쁘다.

마지막으로-내 스크립팅은 다소 녹슨 것입니다. 누군가가 들어가서 코드를 정리 / 수정 / 개선하고 싶다면 평생 가십시오 :)


2
tar명령 행에서 실행중인 경우 입력 control-T하면 SIGINFO가 전송됩니다. 이것이 스크립트에 있다면kill -INFO pid
Brian Swift

완전히 잊어 control-T, 내가 분명히 내 자신의 이익을 위해 스팸 메일에 너무 많은 콘솔 창을 사용 입수했습니다 ..
tanantish

1
할 때 왜 -SIGINFO을 볼 수 없습니다kill -l
펠리페 알바레즈

2

Noah Spurrier의 답변에서 영감을 받음

function tar {
  local bf so
  so=${*: -1}
  case $(file "$so" | awk '{print$2}') in
  XZ) bf=$(xz -lv "$so" |
    perl -MPOSIX -ane '$.==11 && print ceil $F[5]/50688') ;;
  gzip) bf=$(gzip -l "$so" |
    perl -MPOSIX -ane '$.==2 && print ceil $F[1]/50688') ;;
  directory) bf=$(find "$so" -type f | xargs du -B512 --apparent-size |
    perl -MPOSIX -ane '$bk += $F[0]+1; END {print ceil $bk/100}') ;;
  esac
  command tar "$@" --blocking-factor=$bf \
    --checkpoint-action='ttyout=%u%\r' --checkpoint=1
}

출처


17
약간의 맥락과 설명?
Kissaki

1

전체 파일 크기 대신 파일 번호를 알고있는 경우 :

대안 (정확하지만 적합하지는 않음)은 -l 옵션을 사용하여 데이터 컨텐츠 대신 파일 이름을 유닉스 파이프에 전송하는 것입니다.

mydir에 12345 개의 파일을 만들어 보자 . command는 다음과 같다.

[myhost@myuser mydir]$ tar cfvz ~/mytarfile.tgz .|pv -s 12345 -l > /dev/null 

이러한 값을 미리 알고 있거나 (사용 사례 때문에) find + wc 와 같은 명령을 사용 하여 발견 할 수 있습니다.

[myhost@myuser mydir]$ find | wc -l
12345

그렇다면 왜이 명령을 하위 명령에 넣지 않겠습니까? =)
Kirby

tar cfvz ~/mytarfile.tgz . | pv -s $(find . | wc -l) -l > /dev/null. 그것은 당신을 위해 작동합니까?
Kirby

1

tqdm 기반 방법 :

tar -v -xf tarfile.tar -C TARGET_DIR | tqdm --total $(tar -tvf tarfile.tar | wc -l) > /dev/null

1

맥 OS , 첫 번째 (예를 들어, 당신이 모든 명령을 사용할 수 있는지 확인하고 누락 된 것들을 설치 pv)를 사용하여 양조 .

tar 압축하지 않고 싶다면 다음과 같이하십시오.

tar -c folder-with-big-files | pv -s $[$(du -sk folder-with-big-files | awk '{print $1}') * 1024] > folder-with-big-files.tar

압축 하려면 다음을 수행하십시오.

tar cf - folder-with-big-files -P | pv -s $[$(du -sk folder-with-big-files | awk '{print $1}') * 1024] | gzip > folder-with-big-files.tar.gz

참고 : 진행률 표시 줄이 나타나기까지 다소 시간이 걸릴 수 있습니다. 작은 폴더에서 먼저 작동하는지 확인한 다음 큰 파일 폴더로 이동하십시오.


0

다음은 데비안 / 버스터 AMD64에 대한 몇 가지 프로 메테우스 (메트릭 데이터) 백업입니다.

root# cd /path/to/prometheus/
root# tar -cf - ./metrics | ( pv -p --timer --rate --bytes > prometheus-metrics.tar )

사용 가능한 디스크 공간이 부족하여이 작업을 취소했습니다.

다음을 사용하여 진행 상황을 모니터링하기 zstd위해 압축기로 실험 tar하십시오 pv.

root# apt-get update
root# apt-get install zstd pv

root# tar -c --zstd -f - ./metrics | ( pv -p --timer --rate --bytes > prometheus-metrics.tar.zst )
10.2GiB 0:11:50 [14.7MiB/s]

root# du -s -h prometheus
62G    prometheus

root# du -s -h prometheus-metrics.tar.zst
11G    prometheus-metrics.tar.zst
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.