Rsync আউটপুট থেকে "সংলাপ" দিয়ে একটি অগ্রগতি বার তৈরি করা


16

আমি আরএসআইএনসি আউটপুটটিকে এমনভাবে ফিল্টার / পুনঃনির্দেশ করার একটি উপায় খুঁজছি যেখানে এটি "ডায়ালগ - গেজ" কমান্ডকে খাওয়ানো যায়, তাই আমি ফাইল সিঙ্কের সময় একটি দুর্দান্ত চেহারা প্রগতিবার পেতে পারি। বর্তমানে আমি এটি কেবল প্রম্পটে সরাসরি পরীক্ষা করেছি, তবে আমি এটি (বাশ) শেল স্ক্রিপ্টে করার পরিকল্পনা করছি।

আমি ইন্টারনেট ঘুরে দেখেছি এবং বিট এবং টুকরো পেয়েছি, তবে এটি কার্যকর করার জন্য আমি এখনও কিছু মিস করছি

(অস্বীকৃতি: এটি একটি সম্পূর্ণ ভুল পদ্ধতির হতে পারে, এবং এটি একটি পুনর্নির্দেশ / পাইপিং মনস্ট্রোসিটি)

আমি বর্তমানে যা একসাথে রেখেছি:

rsync -avz --progress -e "ssh" user@server:/home/user/data/ /home/user/data | awk -f /home/user/rsync.awk | sed 's/\([0-9]*\).*/\1/' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70

প্রথমে আমার কাছে প্রকট আরএসএনসি কমান্ডটি রয়েছে - প্রোগ্রেস বিকল্পের সাথে আরএসইএনসি থেকে আউটপুটটি বিশ্রী আকারে পাইপ করা হয় এবং ফলোং অ্যাজবি ফিল্টার ব্যবহার করে:

{
   if (index($0, "to-check=") > 0)
   {
        split($0, pieces, "to-check=")
        split(pieces[2], term, ")");
        split(term[1], division, "/");
        print (1-(division[1]/division[2]))*100
}
#   else
#   {
#       print "#"$0;
#   }
   fflush();
}

এটি আরএসসিএন আউটপুট ফিল্টার করে এবং নিম্নলিখিত বিন্যাসে শতাংশ সরবরাহ করে:

53.7037
55.5556
57.4074
59.2593
61.1111
62.963

সুতরাং দশমিক সংখ্যাগুলি থেকে মুক্তি পাওয়ার জন্য, আউটপুটটি সিডে ফিড করি:

sed 's/\([0-9]*\).*/\1/'

যা নিম্নলিখিত ফলাফল দেয়:

64
66
68
70
72
74
75
77

এই সংখ্যাগুলি এভাবে ডায়লগে পাইপ করা হয়েছে:

dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70 

যতদূর আমি জানি, "ডায়ালগ - গেজ" ইত্যাদি এটিকে গ্রহণ করা উচিত, তবে এটি হঠাৎ 100% না হওয়া পর্যন্ত 0% হওয়ার অগ্রগতি প্রদর্শন করে

এখানে কেউ আমাকে সঠিক দিকে নির্দেশ করতে পারে? আমি কি একটি কাজের অগ্রগতি থেকে অনেক দূরে? এটি অর্জনের জন্য আরও ভাল উপায় আছে কি?

শুভেচ্ছা সহ,

Christer

সম্পাদনা : @lynxlynxlynx 'উত্তরটি অ্যাকাউন্টে নেওয়ার পরে, সঠিক কমান্ড লাইনটি হ'ল:

rsync -avz --progress -e "ssh" user@server:/home/user/data/ /home/user/data \ 
 | awk -f /home/user/rsync.awk \ 
 | sed --unbuffered 's/([0-9]*).*/\1/' \ 
 | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70

1
পাইপলাইনে ইওএফ প্রেরণের আগে প্রোগ্রামের আগ পর্যন্ত আউটপুটটি বাফার করছে এমন কোনও কিছু (সম্ভবত অ্যাডক) এর মতো শোনাচ্ছে। ডুনো কীভাবে এটি চেক বা মোকাবেলা করবেন, যদিও ...
শাদুর

উত্তর:


12
for i in 10 20 30; do echo $i; sleep 1; done | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70

ভাল কাজ করে, সুতরাং @ শাদুর ঠিক আছে এবং খেলায় বাফারিং রয়েছে।

যোগ করার পদ্ধতি sedমিশ্রণ শো মধ্যে নগ্ন এটা করা হয় অভিযুক্ত ব্যক্তি (শুধুমাত্র শো 0 এবং 30):

for i in 10 20 30; do echo $i; sleep 1; done | sed 's/\([0-9]*\).*/\1/' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70

এখন যে সমস্যাটি জানা গেছে, আপনার কাছে একাধিক বিকল্প রয়েছে। সবচেয়ে পরিষ্কার হ'ল awkগণিত বা স্ট্রিং ম্যানিপুলেশন দ্বারা শতাংশকে কাটানো / কাটাতে হবে , তবে আপনার জিএনইউ রয়েছে তাই কেবল কৌশলটি sedযুক্ত -uবা করা --unbufferedউচিত।

তবে সম্পূর্ণতার জন্য, একটি সাধারণ পরীক্ষার কেস শোতে awkবাফারিংও করে:

for i in 10 20 30; do echo $i; sleep 1; done | awk '{print $0}' | sed -u 's/\([0-9]*\).*/\1/' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70 

তবে আপনি ইতিমধ্যে এটি পরিচালনা করেন fflush, তাই আমি সমস্যাগুলি আশা করি না।


কি দারুন..! অসংখ্য ধন্যবাদ! সিডে --unbuffered যুক্ত করা প্রয়োজন ছিল কেবল প্রয়োজন! আপনার সময় এবং জ্ঞান Shadur & lynxlynxlynx ভাগ করে নেওয়ার জন্য ধন্যবাদ!
chr1573r

চূড়ান্ত কমান্ডটি দেখতে কেমন তা ভেবে অন্যান্য লোকদের জন্য: rsync -avz --progress -e "ssh" ব্যবহারকারী @ সার্ভার: / হোম / ইউজার / ডেটা / / হোম / ইউজার / ডেটা | awk -f / home/user/rsync.awk | sed - unbuffered 's / ([0-9] *)। * / \ 1 /' | কথোপকথন - শিরোনাম "আমার গজ" - গেজ "হাই, এটি একটি গেজ উইজেট" 20 70
chr1573r

কোনও সমস্যা নেই, এবং সাইটে আপনাকে স্বাগতম। :)
শাদুর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.