سؤال هل هناك طريقة لمعرفة أي تقدم في كل ملف؟


لدي بعض الملفات الكبيرة التي أود ضغطها. يمكنني القيام بذلك على سبيل المثال

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

المشكلة هي أنني لا أرى أي تقدم ، لذلك ليس لدي أدنى فكرة عن المدة التي سيستغرقها أو أي شيء من هذا القبيل. عن طريق v يمكنني على الأقل معرفة وقت اكتمال كل ملف ، ولكن عندما تكون الملفات قليلة وكبيرة ، فهذا ليس أكثر فائدة.

هل هناك طريقة يمكنني من خلالها الحصول على tar لإظهار تقدم أكثر تفصيلاً؟ مثل النسبة المئوية تم إنجازها أو شريط التقدم أو الوقت المقدر المتبقي أو شيء ما. سواء لكل ملف واحد أو كل منهم أو كليهما.


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

ل 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

77
2017-10-25 08:15



في OSX ، لا تأخذ du مجادلة ، تحتاج إلى الرجوع إلى: $ ((du -sk / folder-with | awk '{print $ 1}') * 1024)) - ıɾuǝʞ
لطيفة ، بطانة واحدة. هل يمكنك تفسير ذلك؟ أم أنها تعمل بطريقة سحرية بطريقة أو بأخرى؟ - Kissaki
يمكنك كتابة الأوامر لاستخراج ملف القطران مثل أعلاه؟ - Krzysztof Szewczyk
حسنا ، لدي ذلك pv $FILE.tgz | tar xzf - -C $DEST_DIR - Krzysztof Szewczyk
بالنسبة لنظام التشغيل 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


يمكنك استخدام الكهروضوئية لتحقيق هذا. للإبلاغ عن التقدم بشكل صحيح ، 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 لا يبدو أن يأتي مع نظام التشغيل Mac OS X ، ولكن سيحاول ذلك مرة واحدة لدي جهاز كمبيوتر مع MacPorts عليه. هل يمكن أن توضح ما تفعله هناك؟ لست متأكدا تماما ما يفعله السطر الأول بالضبط. - Svish
السطر الأول: جلب معلومات حول عدد وحدات البايت التي سيتم التعامل معها. السطر الثاني: استخدم الحجم من السطر الأول للسماح لـ pv بعرض "التقدم". منذ كنت piping البيانات ، لا تعرف الكهروضوئية عدد البايتات التي ستأتي. - 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 خيارات في صفحة معلومات tar (كما هو الحال بالنسبة للتوزيع الخاص بي ، لا يرد وصف هذه الخيارات في صفحة الرجل → RTFI).

نرى https://www.gnu.org/software/tar/manual/html_section/tar_26.html

مع هذه (وربما وظيفة لكتابة الأمر الخاص بك نقطة تفتيش) ، يمكنك حساب نسبة ...


10
2017-08-04 20:53



هذا يجب أن يكون الجواب الصحيح. آخرون فقط شرح الأدوات الإضافية (غير مثبتة افتراضيا ، إلى جانب) لتحقيق شيء مماثل. - Carmine Giangregorio
Sardathrion ربما لأن GNU-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





فقط لاحظت التعليق على MacOS ، وبينما أعتقد أن الحل منakira (و pv) هو كثير اعتقدت أنني كنت مطاردة حدس و playaround سريع في المربع MacOS بلدي مع القطران وإرساله إشارة SIGINFO. على ما يرام بما فيه الكفاية ، عملت :) إذا كنت تستخدم نظام BSD ، مثل هذا ينبغي العمل ، ولكن في مربع Linux ، قد تحتاج إلى إرسال 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 أنت تركض أو عالق. ربما لا داعي للقلق كثيرًا بشأن مشكلات التنسيق في هذه الحالة ، نظرًا لأنها ليست سوى فحص سريع ..

هذا النوع من النهج الآلي

إذا كنت تعرف انها سوف يستغرق بعض الوقت، ولكن نريد شيئا مثل مؤشر التقدم، فإن البديل يكون لاطلاق عملية القطران وفي عمل محطة أخرى من انها 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
2018-04-21 20:44



إذا كان يعمل tar على سطر الأوامر ، الكتابة control-T سوف يرسلها SIGINFO. إذا كان هذا في نص برمجي ، فسيتم ذلك kill -INFO pid - Brian Swift
نسيت تماما عن control-T، من الواضح أنني اعتدت على البريد المزعج الكثير من نوافذ وحدة التحكم من أجل بلدي جيدة .. - tanantish
لماذا لا أستطيع رؤية SIGINFO عند القيام بذلك kill -l - Felipe Alvarez


مستوحاة من الجواب نوح 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
}

مصدر


2
2018-04-18 01:00



سياق قليل وشرح ربما؟ - Kissaki


إذا كنت تعرف رقم الملف بدلاً من الحجم الإجمالي لجميعهم:

بديل (أقل دقة ولكنه مناسب) هو استخدام الخيار -l وإرسالها في unix pipe أسماء الملفات بدلاً من محتوى البيانات.

دعونا لدينا 12345 الملفات في MYDIRالأمر هو:

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

يمكنك معرفة هذه القيمة مقدما (بسبب حالة استخدامك) أو استخدام بعض الأوامر مثل تجد + مرحاض لاكتشافه:

[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


طريقة تستند على tqdm:

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

0
2018-04-27 06:44