सवाल क्या प्रति फ़ाइल में कोई भी टैर प्रगति देखने का कोई तरीका है?


मेरे पास कुछ बड़ी फ़ाइलें हैं जिन्हें मैं संपीड़ित करना चाहता हूं। उदाहरण के लिए मैं इसे कर सकता हूं

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

समस्या यह है कि मुझे कोई प्रगति दिखाई नहीं दे रही है, इसलिए मेरे पास कोई सुराग नहीं है कि यह कितना समय लगेगा या ऐसा कुछ भी होगा। का उपयोग करते हुए v मैं कम से कम देख सकता हूं कि प्रत्येक फ़ाइल कब पूर्ण हो जाती है, लेकिन जब फ़ाइलें कम और बड़ी होती हैं तो यह सबसे उपयोगी नहीं होती है।

क्या कोई तरीका है कि मैं अधिक विस्तृत प्रगति दिखाने के लिए टैर प्राप्त कर सकता हूं? एक प्रतिशत या प्रगति पट्टी या अनुमानित समय बाएं या कुछ की तरह। या तो प्रत्येक एकल फ़ाइल या उनमें से सभी या दोनों के लिए।


105
2017-07-28 11:51


मूल




जवाब:


मैं इस तरह के 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

ओएसएक्स के लिए (केंजी के जवाब से)

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

77
2017-10-25 08:15



ओएसएक्स पर, डु-डी तर्क नहीं लेता है, जिस पर फॉलबैक करने की आवश्यकता होती है: $ ((du -sk / folder-with | awk '{print $ 1}') * 1024)) - ıɾuǝʞ
अच्छा, एक लाइनर। क्या आप इसे समझा सकते हैं? या यह किसी भी तरह से जादूगर काम करता है? - Kissaki
क्या आप ऊपर की तरह टैर फ़ाइल निकालने के लिए कमांड लिख सकते हैं? - Krzysztof Szewczyk
ठीक है, मेरे पास है pv $FILE.tgz | tar xzf - -C $DEST_DIR - Krzysztof Szewczyk
ओएस एक्स के लिए, मुझे अंकगणितीय विस्तार के लिए स्क्वायर ब्रैकेट फॉर्म का उपयोग करने की आवश्यकता थी, जिसने बनाया: 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


आप उपयोग कर सकते हैं पीवी इसे पाने के लिये। प्रगति की सही रिपोर्ट करने के लिए, 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

71
2017-07-28 12:01



ठंडा। pv मैक ओएस एक्स के साथ प्रतीत नहीं होता है, लेकिन मैकपॉर्ट्स के साथ कंप्यूटर होने के बाद यह कोशिश करूँगा। क्या आप समझा सकते हैं कि आप वहां क्या कर रहे हैं? बिल्कुल यकीन नहीं है कि पहली पंक्ति वास्तव में क्या करती है। - Svish
पहली पंक्ति: इस बारे में जानकारी प्राप्त करें कि कितने बाइटों को संभाला जाएगा। दूसरी पंक्ति: पीवी को 'प्रगति' प्रस्तुत करने की अनुमति देने के लिए पहली पंक्ति से आकार का उपयोग करें। चूंकि आप डेटा पाइप कर रहे हैं, पीवी नहीं जानता कि कितने बाइट आएंगे। - akira
एक जोड़ा: SIZE=$(($SIZE * 1000 / 1024)) - मुझे नहीं पता कि यह मेरे विशेष मंच पर एक कर्कश है या नहीं, इसलिए मैं इसे उत्तर में नहीं जोड़ रहा हूं: du रिटर्न आकार जहां 1 केबी = 1024 बाइट्स, जबकि pv ऐसा लगता है कि 1 केबी = 1000 बाइट्स की उम्मीद है। (मैं उबंटू 10.04 पर हूं) - Izkata
@lzkata आप हमेशा पूछ सकते हैं du अपने पसंदीदा ब्लॉकज का उपयोग करने के लिए, उदा। du -s --block-size=1000, या सिर्फ सादे बाइट्स के साथ काम करें, उदा। गिराओ kसे है du तथा pv कहता है। फिर भी, मैं दोनों का उपयोग करने की उम्मीद करता हूं 1024 जब तक अन्यथा नहीं बताया गया, उदा। --si खोलना du, उदाहरण के लिए। - Legolas
या बस के-सामान ड्रॉप करें और केवल सादे बाइट्स का उपयोग करें (du -sb तथा pv -s बिना किसी संशोधक के)। जो सभी भ्रम खत्म करना चाहिए। - akira


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

apt-get install pv dialog

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

enter image description here


20
2017-08-28 08:26



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


इसकी जाँच पड़ताल करो --checkpoint तथा --checkpoint-action टैर जानकारी पृष्ठ में विकल्प (मेरे वितरण के लिए, इन विकल्पों के लिए विवरण मैन पेज → आरटीएफआई में निहित नहीं है)।

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

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


10
2017-08-04 20:53



यह सही जवाब होना चाहिए। कुछ समान कुछ हासिल करने के लिए बस अतिरिक्त टूल (डिफ़ॉल्ट रूप से स्थापित नहीं) की व्याख्या करते हैं। - Carmine Giangregorio
@ सार्डथ्रियन शायद क्योंकि यह जीएनयू-tar विशिष्ट। - phk


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

एक और तरीका देशी का उपयोग करें 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:   [>>>>>>>>>>>>>>>>>>>>>>>

एक पूर्ण उदाहरण यहाँ


5
2017-07-16 00:22





मैकोज़ के बारे में टिप्पणी पर ध्यान दिया, और जब मुझे लगता है कि @किरा (और पीवी) का समाधान है बहुत नीदर मैंने सोचा था कि मैं अपने मैकोज़ बॉक्स में टैर के साथ एक झुकाव और एक त्वरित प्लेराउंड का पीछा करता हूं और इसे एक सिगिनो सिग्नल भेजता हूं। काफी हद तक, यह काम किया :) यदि आप बीएसडी जैसी प्रणाली पर हैं, तो यह चाहिए काम, लेकिन एक लिनक्स बॉक्स पर, आपको एक SIGUSR1, और / या भेजने की आवश्यकता हो सकती है tar शायद वैसे ही काम नहीं कर सकता है।

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

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

विज्ञापन-स्थान, मैन्युअल दृष्टिकोण

यदि आप विज्ञापन-आधारित आधार पर स्थिति की जांच करने में सक्षम होना चाहते हैं, तो आप हिट कर सकते हैं 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
2018-04-21 20:44



अगर चल रहा है tar कमांड लाइन पर, टाइपिंग control-T इसे एक SIGINFO भेज देंगे। अगर यह एक लिपि में था तो यह किया जाएगा kill -INFO pid - Brian Swift
पूरी तरह से भूल गए control-T, मैं स्पष्ट रूप से अपने स्वयं के अच्छे के लिए बहुत सी कंसोल खिड़कियों को स्पैम करने के लिए उपयोग किया गया है .. - tanantish
मैं क्यों नहीं देख सकता- SIGINFO करते समय kill -l - Felipe Alvarez


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

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
}

स्रोत


2
2018-04-18 01:00



थोड़ा संदर्भ और स्पष्टीकरण शायद? - Kissaki


यदि आप उन सभी के कुल आकार के बजाय फ़ाइल नंबर ज्ञात हैं:

एक विकल्प (कम सटीक लेकिन उपयुक्त) -l विकल्प का उपयोग करना है और यूनिक्स पाइप को डेटा सामग्री के बजाय फ़ाइल नाम भेजना है।

चलो 12345 फाइलें हैं mydir, आदेश है:

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

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

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

1
2017-09-15 12:38



तो, इस आदेश को सब-कमांड में क्यों न रखें? =) - Kirby
tar cfvz ~/mytarfile.tgz . | pv -s $(find . | wc -l) -l > /dev/null। क्या यह आपके लिए काम करता है? - Kirby