ফাইলের জন্য কোনও ট্যারে অগ্রগতি দেখার কোনও উপায় আছে কি?


122

আমার কাছে কয়েকটি বড় ফাইল রয়েছে যা আমি সংকোচন করতে চাই। উদাহরণস্বরূপ আমি এটি করতে পারি

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

সমস্যাটি হ'ল আমি কোনও অগ্রগতি দেখতে পাচ্ছি না, সুতরাং এটি কতক্ষণ লাগবে বা এর মতো কোনও কিছুই আমার কাছে নেই। vআমি ব্যবহার করে কমপক্ষে প্রতিটি ফাইলের কাজ শেষ হয় তা দেখতে পাই তবে ফাইলগুলি যখন কম এবং বড় হয় তবে এটি সবচেয়ে বেশি সহায়ক হয় না।

আরও বিস্তারিত অগ্রগতি দেখানোর জন্য কি আমি কী উপায় পেতে পারি? শতকরা এক ভাগ বা অগ্রগতি বার বা আনুমানিক সময় বা অন্য কিছু হিসাবে। হয় প্রতিটি একক ফাইল বা তাদের সমস্ত বা উভয়ের জন্য।

উত্তর:


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

ওএসএক্সের জন্য (কেনজির উত্তর থেকে)

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))
29uǝʞ

4
ভাল, একটি এক লাইনার তুমি কি এটা ব্যাখ্যা করতে পারবে? বা এটি কি কোনওভাবে যাদুবিদ্যায় কাজ করে?
কিসাকি 18

2
ঠিক আছে, আমার কাছে এটি আছেpv $FILE.tgz | tar xzf - -C $DEST_DIR
ক্রিজিসটফ শেজেভজাইক

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আপনাকে কতটা বাইট দেখেছে তা আপনাকে জানানোর জন্য; এটি একটি 'অনেক বেশি এবং সেই দ্রুত সম্পন্ন' প্রতিবেদন করবে।

% 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
প্রথম লাইন: কত বাইট পরিচালনা করা হবে সে সম্পর্কে তথ্য আনুন। দ্বিতীয় লাইন: পিভিটিকে 'অগ্রগতি' রেন্ডার করার জন্য প্রথম লাইন থেকে আকারটি ব্যবহার করুন। যেহেতু আপনি ডেটা পাইপ করছেন, পিভি জানি না আরও কতগুলি বাইট আসবে।
আকির

একটি সংযোজন: SIZE=$(($SIZE * 1000 / 1024))- এটি আমার নির্দিষ্ট প্ল্যাটফর্মে কোনও গণ্ডগোল কিনা তা আমি জানি না, তাই আমি এটি উত্তরে যুক্ত করছি না: duআয়তনের আয়তন যেখানে 1 কেবি = 1024 বাইট, যখন pvপ্রত্যাশা করা হচ্ছে 1 কেবি = 1000 বাইট। (আমি উবুন্টু 10.04 এ আছি)
ইজকাটা

2
@ লজকাটা আপনি সর্বদা duআপনার পছন্দসই ব্লকসাইজ ব্যবহার করতে বলতে পারেন, উদাহরণস্বরূপ du -s --block-size=1000, বা কেবল প্লেইন বাইটস সহ কাজ করুন, উদাহরণস্বরূপ k'গুলি duএবং pvকল ' থেকে ড্রপ করুন । তবুও, আমি উভয় ব্যবহারের আশা করব 1024অন্যথায় না বলা পর্যন্ত, উদাহরণস্বরূপ, --siস্যুইচ অন করুন du
লেগোলাস

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আলকাতরা তথ্য পৃষ্ঠা থেকে অপশন (আমার বিতরণের জন্য যেমন, এই বিকল্পের জন্য বিবরণ man পৃষ্ঠা উপস্থিত রয়েছে নয় → RTFI)।

Https://www.gnu.org/software/tar/manual/html_section/tar_26.html দেখুন

এগুলি (এবং সম্ভবত আপনার নিজের চেকপয়েন্ট কমান্ডটি লেখার জন্য কার্যকারিতা) দিয়ে আপনি একটি শতাংশ গণনা করতে পারেন ...


3
এটি সঠিক উত্তর হওয়া উচিত। অন্যরা অনুরূপ কিছু অর্জনের জন্য কেবল অতিরিক্ত সরঞ্জাম (ডিফল্টরূপে ইনস্টল করা নেই) ব্যাখ্যা করে।
কারমিন গিয়াংগ্রোরিও

@ সারদাথ্রিয়ন সম্ভবত এটি জিএনইউ- tarনির্দিষ্ট হওয়ার কারণে ।
পিএইচকে

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) থেকে সমাধান মনে করি অনেক neater আমি আলকাতরা এবং এটি একটি SIGINFO সংকেত পাঠানোর সাথে আমার MacOS এর বাক্সে একটি দলা এবং একটি দ্রুত playaround তাড়া চাই। আনন্দের সাথে যথেষ্ট, এটি কাজ করেছে :) আপনি যদি BSD- এর মতো সিস্টেমে থাকেন তবে এটি কাজ করা উচিত তবে লিনাক্স বাক্সে আপনাকে একটি SIGUSR1 প্রেরণ করতে হবে এবং / অথবা tarএকইভাবে কাজ নাও করতে পারে।

নীচের দিকটি হ'ল এটি আপনাকে কেবলমাত্র একটি আউটপুট সরবরাহ করবে (স্টাডআউটে) বর্তমান ফাইলটি কতটা দূরে তা দেখায় যেহেতু আমি অনুমান করছি যে এটি কত বড় ডেটা স্ট্রিম পাচ্ছে সে সম্পর্কে কোনও ধারণা নেই।

সুতরাং হ্যাঁ, একটি বিকল্প উপায় হ'ল টার জ্বালিয়ে দেওয়া এবং পর্যায়ক্রমে এটি সাইন ইন করা পাঠানো যে কোনও সময় আপনি জানতে চেয়েছিলেন যে এটি কতদূর এগিয়েছে। কিভাবে এই কাজ করতে?

অ্যাড-হক, ম্যানুয়াল পদ্ধতি

আপনি যদি কোনও অ্যাড-হক ভিত্তিতে স্থিতি পরীক্ষা করতে সক্ষম হতে চান তবে আপনি control-Tপ্রাসঙ্গিক উইন্ডোতে (ব্রায়ান সুইফ্ট উল্লিখিত হিসাবে) আঘাত করতে পারেন যা সাইন ইনফোকো সিগন্যালটি প্রেরণ করবে। এটির সাথে একটি সমস্যা হ'ল এটি আমার সম্পূর্ণ চেইনে প্রেরণ করবে যা আমি বিশ্বাস করি, তাই আপনি যদি করছেন:

% 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, আমি স্পষ্টতই আমার নিজের ভালোর জন্য অনেকগুলি কনসোল উইন্ডো স্প্যাম করতে
অভ্যস্ত হয়েছি

1
কেন আমি সিজিএনএফও দেখতে পাচ্ছি না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
একটু প্রসঙ্গ এবং ব্যাখ্যা হয়তো?
কিসাকি 18

1

আপনি যদি তাদের সকলের মোট আকারের পরিবর্তে ফাইল নম্বরটি জানতেন:

বিকল্প হিসাবে (কম নির্ভুল তবে উপযুক্ত) হ'ল -l বিকল্পটি ব্যবহার করা এবং ইউনিক্স পাইপে ডেটা সামগ্রীর পরিবর্তে ফাইলের নাম পাঠানো।

মাইডিরে 12345 ফাইল থাকা যাক , কমান্ডটি হ'ল:

[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

এখানে দেবিয়ান / বাস্টার এএমডি on৪ তে কিছু প্রমিথিউস (মেট্রিক্স ডেটা) ব্যাকআপ দেওয়া আছে:

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

পর্যাপ্ত ডিস্ক-স্পেস না থাকায় এই কাজটি বাতিল করা হয়েছে।

অগ্রগতি পর্যবেক্ষণ করে ব্যবহার করে সংক্ষেপক zstdহিসাবে পরীক্ষামূলকভাবে :tarpv

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.