มีวิธีดูความคืบหน้า tar ใด ๆ ต่อไฟล์หรือไม่?


122

ฉันมีไฟล์ขนาดใหญ่สองไฟล์ที่ฉันต้องการบีบอัด ฉันสามารถทำได้ด้วยตัวอย่างเช่น

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

ปัญหาคือฉันไม่เห็นความคืบหน้าใด ๆ ดังนั้นฉันจึงไม่รู้ว่าจะใช้เวลานานแค่ไหนหรืออะไรทำนองนั้น ใช้vฉันอย่างน้อยสามารถดูเมื่อแต่ละไฟล์เสร็จสมบูรณ์ แต่เมื่อไฟล์มีขนาดเล็กและใหญ่นี้ไม่ได้เป็นประโยชน์มากที่สุด

มีวิธีที่ฉันจะได้รับ tar เพื่อแสดงความคืบหน้าอย่างละเอียดมากขึ้น? ชอบเปอร์เซ็นต์ที่ทำหรือแถบความคืบหน้าหรือเวลาที่เหลืออยู่หรือบางสิ่งบางอย่างโดยประมาณ อาจเป็นไฟล์เดี่ยวหรือไฟล์ทั้งหมดหรือทั้งสองไฟล์

คำตอบ:


100

ฉันชอบผู้ดูแลผิวหน้าเช่นนี้:

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 (จากคำตอบของเคนจิ)

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
ใน OSX ดู่ไม่ใช้อาร์กิวเมนต์ -b ที่จำเป็นในการที่จะ fallback: $ ((du -sk / โฟลเดอร์กับ | awk '{พิมพ์ $ 1}') * 1024))
ıɾ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จำเป็นต้องรู้จำนวนไบต์ที่คุณขว้างไป ดังนั้นขั้นตอนแรกคือการคำนวณขนาด (เป็น kbyte) นอกจากนี้คุณยังสามารถวางแถบความคืบหน้าได้อย่างสมบูรณ์และเพียงแค่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

เย็น. pvดูเหมือนจะไม่ได้มาพร้อมกับ Mac OS X แต่จะลองใช้เมื่อฉันมีคอมพิวเตอร์ที่มี MacPort อยู่ คุณช่วยอธิบายสิ่งที่คุณทำที่นั่นได้ไหม? ไม่แน่ใจว่าบรรทัดแรกทำอะไรกันแน่
Svish

4
บรรทัดแรก: ดึงข้อมูลเกี่ยวกับจำนวนไบต์ที่จะจัดการ บรรทัดที่สอง: ใช้ขนาดจากบรรทัดแรกเพื่ออนุญาตให้ pv แสดงผล 'คืบหน้า' เนื่องจากคุณกำลังไพพ์ข้อมูล pv ไม่ทราบจำนวนไบต์ที่จะมาเพิ่มเติม
akira

สิ่งที่เพิ่มเติม: SIZE=$(($SIZE * 1000 / 1024))- ฉันไม่รู้ว่านี่เป็นสิ่งผิดปกติบนแพลตฟอร์มเฉพาะของฉันหรือไม่ดังนั้นฉันจึงไม่เพิ่มลงในคำตอบ: duส่งคืนขนาดที่ 1 kb = 1024 ไบต์ในขณะที่pvดูเหมือนว่าจะคาดหวัง 1 kb = 1,000 ไบต์ (ฉันใช้ Ubuntu 10.04)
Izkata

2
@lzkata คุณสามารถขอduให้คุณใช้บล็อคขนาดที่คุณต้องการเช่นdu -s --block-size=1000หรือเพียงแค่ทำงานกับไบต์ธรรมดาเช่นวางkของจากการโทรduและ pvอย่างไรก็ตามฉันคาดหวังว่าทั้งสองจะใช้1024เว้นแต่จะบอกเป็นอย่างอื่นเช่น--siเปิดสวิตช์duเป็นต้น
เลโกลัส

1
หรือเพียงแค่ปล่อย k-stuff และเพียงแค่ใช้ไบต์ธรรมดา ( du -sbและpv -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

ตรวจสอบ--checkpointและ--checkpoint-actionตัวเลือกในหน้าข้อมูล tar (สำหรับการแจกจ่ายของฉัน, คำอธิบายสำหรับตัวเลือกเหล่านี้ไม่มีอยู่ใน man page → 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 ของฉันด้วยน้ำมันดินและส่งสัญญาณ SIGINFO สนุกมากพอมันทำงานได้ดี :) ถ้าคุณอยู่ในระบบที่เหมือน BSD สิ่งนี้น่าจะใช้ได้ แต่บนกล่อง Linux คุณอาจต้องส่ง SIGUSR1 และ / หรือtarอาจไม่ทำงานเหมือนกัน

ข้อเสียคือมันจะให้ผลลัพธ์ (ที่ stdout) เพียงแสดงให้คุณเห็นว่าไฟล์ปัจจุบันมันไกลแค่ไหนเนื่องจากฉันคิดว่ามันไม่รู้ว่ากระแสข้อมูลที่ได้รับนั้นใหญ่แค่ไหน

ดังนั้นใช่วิธีการทางเลือกคือการเผาไหม้น้ำมันดินและส่ง SIGINFOs เป็นระยะ ๆ เมื่อใดก็ตามที่คุณต้องการทราบว่ามันได้รับไปไกลแค่ไหน ทำอย่างไร

Ad-hoc แนวทางแบบแมนนวล

หากคุณต้องการตรวจสอบสถานะแบบเฉพาะกิจคุณสามารถกดcontrol-T(ตามที่ Brian Swift กล่าวถึง) ในหน้าต่างที่เกี่ยวข้องซึ่งจะส่งสัญญาณ SIGINFO ปัญหาหนึ่งที่มีก็คือมันจะส่งไปยังห่วงโซ่ทั้งหมดของคุณฉันเชื่อว่าดังนั้นหากคุณกำลังทำ:

% 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 แล้วโยนมันลงในสคริปต์ที่ส่งสัญญาณซ้ำ ๆ . ตัวอย่างเช่นหากคุณมี scriptlet ต่อไปนี้ (และเรียกใช้ตามที่พูด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 และส่งชื่อไฟล์ไปยัง unix pipe แทนเนื้อหาข้อมูล

มามีไฟล์ 12345 ในmydirแล้วคำสั่งคือ:

[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. มันใช้งานได้สำหรับคุณหรือไม่
เคอร์บี้


1

บนMacOSแรกให้แน่ใจว่าคุณมีคำสั่งทั้งหมดที่มีอยู่และติดตั้งคนที่ขาดหายไป (เช่น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.