क्या प्रति फ़ाइल किसी भी तरक्की को देखने का एक तरीका है?


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 के लिए (केनजी के उत्तर से)

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 पर, डु-बी तर्क नहीं लेता है, को बैकबैक की जरूरत है: $ ((du -sk / folder-with | awk '{प्रिंट $ 1}') * 1024))
ɾɾɾǝʞ

4
अच्छा लगा, एक लाइनर। क्या आप इसे समझा सकते हैं? या यह सिर्फ जादुई किसी तरह काम करता है?
Kissaki

2
ठीक है, मेरे पास हैpv $FILE.tgz | tar xzf - -C $DEST_DIR
Krzysztof Szewczyk

1
ओएस एक्स के लिए, मुझे अंकगणितीय विस्तार के लिए स्क्वायर ब्रैकेट फॉर्म का उपयोग करने की आवश्यकता थी, जिसने बनाया: 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 ')'
डीन बेकर

1
ध्यान दें कि प्रगति तब तक नहीं दिखाई देती है जब तक कि डु कमांड पूरी न हो जाए, जो निर्देशिका के आकार, जटिलता और विखंडन के आधार पर कुछ समय ले सकता है।
मुर्गा 242

75

इसे प्राप्त करने के लिए आप pv का उपयोग कर सकते हैं । प्रगति को सही ढंग से रिपोर्ट pvकरने के लिए , यह जानने की जरूरत है कि आप उस पर कितना बाइट फेंक रहे हैं। तो, पहला कदम आकार की गणना करना है (किबे में)। आप प्रगति पट्टी को पूरी तरह से छोड़ सकते हैं और बस 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मैक ओएस एक्स के साथ आने के लिए प्रतीत नहीं होता है, लेकिन जब मैं इस पर मैकपोर्ट्स के साथ एक कंप्यूटर रखता हूं, तो यह कोशिश करेगा। क्या आप समझा सकते हैं कि आप वहाँ क्या कर रहे हैं? बिल्कुल निश्चित नहीं कि पहली पंक्ति वास्तव में क्या करती है।
शाविश

4
पहली पंक्ति: कितने बाइट को संभाला जाएगा के बारे में जानकारी प्राप्त करें। दूसरी पंक्ति: pv को 'प्रगति' को प्रस्तुत करने की अनुमति देने के लिए पहली पंक्ति से आकार का उपयोग करें। चूंकि आप डेटा पाइप कर रहे हैं, pv को नहीं पता कि कितने और बाइट्स आएंगे।
अकीरा

एक जोड़: SIZE=$(($SIZE * 1000 / 1024))- मुझे नहीं पता कि यह मेरे विशेष मंच पर एक विचित्रता है या नहीं, इसलिए मैं इसे उत्तर में नहीं जोड़ रहा हूं: duरिटर्न का आकार जहां 1 केबी = 1024 बाइट्स, जबकि pv1 केबी = 1000 की उम्मीद है बाइट्स। (मैं उबंटू 10.04 पर हूं)
इज़काता

2
@lzkata आप हमेशा duअपने पसंदीदा blockize का उपयोग करने के लिए कह सकते हैं , जैसे du -s --block-size=1000, या सिर्फ सादे बाइट्स के साथ काम करते हैं, जैसे कॉल और कॉल kसे ड्रॉप । फिर भी, मैं उम्मीद करूंगा कि दोनों का उपयोग करें जब तक कि अन्यथा नहीं बताया जाता, उदाहरण के लिए स्विच ऑन । dupv1024--sidu
लेगोलस

1
या के-सामान को छोड़ दें और बस सादे बाइट्स का उपयोग करें ( du -sbऔर pv -sबिना किसी संशोधक के)। कि सभी भ्रम को समाप्त करना चाहिए।
अकीरा

22

बेहतर प्रगति बार ..

apt-get install pv dialog

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

यहाँ छवि विवरण दर्ज करें


2
यह निष्कर्षण के लिए काम करता है, लेकिन आपको अभी भी निर्माण के लिए अधिक जटिल आदेशों में से एक करने की आवश्यकता है (जो मूल प्रश्न था)। यह अभी भी उन लोगों के साथ जोड़ा जा सकता है; यह अभी और जटिल है।
डैनियल एच

17

की जाँच करें --checkpointऔर --checkpoint-actionटार की जानकारी पेज में विकल्प (मेरे वितरण के लिए के रूप में, इन विकल्पों के लिए विवरण आदमी पेज में निहित नहीं है → RTFI)।

Https://www.gnu.org/software/tar/manual/html_section/tar_26.html देखें

इन के साथ (और शायद अपने स्वयं के चेकपॉइंट कमांड लिखने की कार्यक्षमता), आप प्रतिशत की गणना कर सकते हैं ...


3
यह सही उत्तर होना चाहिए। अन्य लोग कुछ समान हासिल करने के लिए केवल अतिरिक्त टूल (डिफ़ॉल्ट रूप से, इसके अलावा स्थापित नहीं) की व्याख्या करते हैं।
बजे कारमाइन गिएंगगोरियो

@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) से समाधान बहुत अधिक है, तो मैंने सोचा कि मैं अपने मैकओएस बॉक्स में एक हच और एक त्वरित प्लेड टार के साथ पीछा करूंगा और इसे SIGINFO सिग्नल भेजूंगा। पर्याप्त रूप से, यह काम किया :) अगर आप बीएसडी जैसी प्रणाली पर हैं, तो यह काम करना चाहिए , लेकिन लिनक्स बॉक्स पर, आपको SIGUSR1 भेजने की आवश्यकता हो सकती है, और / या tarउसी तरह काम नहीं कर सकता है।

नीचे की ओर यह है कि यह आपको केवल एक आउटपुट के साथ प्रदान करेगा (stdout पर) जो आपको दिखा रहा है कि वर्तमान फ़ाइल के माध्यम से कितनी दूर है क्योंकि मैं यह अनुमान लगा रहा हूं कि इसके बारे में कोई पता नहीं है कि यह डेटा स्ट्रीम कितनी बड़ी हो रही है।

तो हाँ, एक वैकल्पिक तरीका टार को फायर करना होगा और समय-समय पर इसे SIGINFOs को भेजना होगा जब तक आप यह जानना चाहते हैं कि यह कितनी दूर हो गया है। यह कैसे करना है?

तदर्थ, मैनुअल दृष्टिकोण

यदि आप एक तदर्थ आधार पर स्थिति की जांच करने में सक्षम होना चाहते हैं, तो आप control-Tसंबंधित विंडो में हिट कर सकते हैं (जैसा कि ब्रायन स्विफ्ट का उल्लेख किया गया है) जो SIGINFO सिग्नल को भेज देगा। इसके साथ एक मुद्दा यह है कि मैं इसे आपकी पूरी श्रृंखला के लिए भेजूंगा, मेरा मानना ​​है कि यदि आप कर रहे हैं:

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

आपको bzip2 रिपोर्ट भी दिखाई देगी जो कि स्टेटस के साथ टार है:

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क्या आप चल रहे हैं तो अटक गया है, या बस धीमा है। आप शायद इस मामले में मुद्दों को प्रारूपित करने के बारे में बहुत ज्यादा चिंता करने की जरूरत नहीं है, क्योंकि यह केवल एक त्वरित जांच है।

स्वचालित दृष्टिकोण का प्रकार

यदि आप जानते हैं कि इसमें कुछ समय लगने वाला है, लेकिन प्रगति संकेतक की तरह कुछ करना चाहते हैं, तो एक विकल्प यह होगा कि आप अपने टार प्रोसेस को बंद कर दें और दूसरे टर्मिनल वर्क आउट में यह पीआईडी ​​है और फिर इसे एक स्क्रिप्ट में फेंक दें जो कि बार-बार सिग्नल भेजता है। । उदाहरण के लिए, यदि आपके पास निम्नलिखित स्क्रिप्टलेट है (और इसे कहते हैं 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
ब्रायन स्विफ्ट

के बारे में पूरी तरह से भूल गया control-T, मैं स्पष्ट रूप से अपने खुद के अच्छे के लिए कई कंसोल विंडो स्पैमिंग करने के लिए इस्तेमाल किया है ..
tanantish

1
मैं क्यों नहीं देख सकता -SIGINFO करते समयkill -l
फेलिप अल्वारेज़

2

नूह स्प्रियर के जवाब से प्रेरित

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 विकल्प का उपयोग करना और यूनिक्स पाइप फाइलनाम में भेजना है।

चलो 12345 फाइलें mydir में हैं , कमांड है:

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

आप ऐसे मूल्य को पहले से जान सकते हैं (आपके उपयोग के मामले के कारण) या इसे खोजने के लिए find + wc जैसे कुछ कमांड का उपयोग करें :

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

तो, इस कमांड को सब-कमांड में क्यों नहीं रखा गया? =)
किर्बी

tar cfvz ~/mytarfile.tgz . | pv -s $(find . | wc -l) -l > /dev/null। क्या यह आपके लिए काम करता है?
किर्बी

1

Tqdm पर आधारित विधि :

tar -v -xf tarfile.tar -C TARGET_DIR | tqdm --total $(tar -tvf tarfile.tar | wc -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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.