বাইট-কাউন্টকে মানব কিবি এমআইবি ইত্যাদিতে রূপান্তর করার একটি মানক সরঞ্জাম; du, ls1 এর মতো


94

1.00 এবং 1023.99 এর মধ্যে সংখ্যাসূচক মান বজায় রেখে এমন কোনও মানক সরঞ্জাম রয়েছে যা বাইটের একটি পূর্ণসংখ্যা গণকে বৃহত্তম সম্ভব ইউনিট-আকারের মানব-পঠনযোগ্য গণনায় রূপান্তর করে?

আমার নিজস্ব বাশ / অ্যাজক স্ক্রিপ্ট রয়েছে তবে আমি একটি স্ট্যান্ডার্ড সরঞ্জামের সন্ধান করছি যা অনেক / সর্বাধিক ডিস্ট্রোজে পাওয়া যায় ... আরও সাধারণভাবে পাওয়া যায় এবং আদর্শভাবে সাধারণ কমান্ড লাইন আরগস রয়েছে এবং / অথবা পাইপযুক্ত ইনপুট গ্রহণ করতে পারে।

আমি যে ধরণের আউটপুট খুঁজছি তার কয়েকটি উদাহরণ এখানে।

    1    Byt  
  173.00 KiB  
   46.57 MiB  
    1.84 GiB  
   29.23 GiB  
  265.72 GiB  
    1.63 TiB  

এখানে বাইট-হিউম্যান স্ক্রিপ্ট (উপরের ফলাফলের জন্য ব্যবহৃত)

awk -v pfix="$1" -v sfix="$2" 'BEGIN { 
      split( "Byt KiB MiB GiB TiB PiB", unit )
      uix = uct = length( unit )
      for( i=1; i<=uct; i++ ) val[i] = (2**(10*(i-1)))-1
   }{ if( int($1) == 0 ) uix = 1; else while( $1 < val[uix]+1 ) uix--
      num = $1 / (val[uix]+1)
      if( uix==1 ) n = "%5d   "; else n = "%8.2f"
      printf( "%s"n" %s%s\n", pfix, num, unit[uix], sfix ) 
   }'

আপডেট  এখানে গিলসের স্ক্রিপ্টের একটি পরিবর্তিত সংস্করণ রয়েছে , যেমনটি তার উত্তরের মন্তব্যে বর্ণিত হয়েছে .. (আমার পছন্দসই চেহারা অনুসারে পরিবর্তিত)।

awk 'function human(x) {
         s=" B   KiB MiB GiB TiB EiB PiB YiB ZiB"
         while (x>=1024 && length(s)>1) 
               {x/=1024; s=substr(s,5)}
         s=substr(s,1,4)
         xf=(s==" B  ")?"%5d   ":"%8.2f"
         return sprintf( xf"%s\n", x, s)
      }
      {gsub(/^[0-9]+/, human($1)); print}'

4
দেখে মনে হচ্ছে এখানে standard toolতৈরিতে আমাদের একটি নতুন রয়েছে :)
গোথাম

@ গৌতম - আপনার ইচ্ছাটি সত্য হয়ে উঠতে পারে! আমার উত্তর নীচে দেখুন বা blog.frankleonhardt.com/2015/…
এফজেএল

নোট করুন যে শেষ দুটি প্রত্যয়টি অদলবদল হয়েছে; একটি ইয়োটাবাইট আসলে জেটটাবাইটের চেয়ে বড়।
স্ট্যাটিকফ্লোট

উত্তর:


89

না, এমন কোনও মানক সরঞ্জাম নেই।

নন-এম্বেডড লিনাক্স এবং সাইগউইনে জিএনইউ কোর্টিলগুলি ৮.২১ (ফেব্রুয়ারী ২০১৩, তাই এখনও সমস্ত বিতরণে উপস্থিত নেই), আপনি ব্যবহার করতে পারেন numfmt। এটি ঠিক একই আউটপুট ফর্ম্যাট তৈরি করে না (কোরিউটিলস 8.23 ​​হিসাবে, আমি মনে করি না যে আপনি দশমিক পয়েন্টের পরে 2 সংখ্যা পেতে পারেন)।

$ numfmt --to=iec-i --suffix=B --padding=7 1 177152 48832200 1975684956
     1B
 173KiB
  47MiB
 1.9GiB

অনেক পুরানো জিএনইউ সরঞ্জাম এই ফর্ম্যাটটি তৈরি করতে পারে এবং জিএনইউ সারণি কোর্টিলস .5.৫ (অগাস্ট ২০০৯, যেহেতু আধুনিক নন-এমবেডড লিনাক্স বিতরণে উপস্থিত রয়েছে) থেকে ইউনিটগুলির সাথে সংখ্যাগুলি বাছাই করতে পারে


আমি আপনার কোডটি কিছুটা সংশ্লেষিত পেয়েছি। এখানে একটি ক্লিনার অ্যাডক সংস্করণ রয়েছে (আউটপুট ফর্ম্যাটটি হুবহু এক নয়):

awk '
    function human(x) {
        if (x<1000) {return x} else {x/=1024}
        s="kMGTEPZY";
        while (x>=1000 && length(s)>1)
            {x/=1024; s=substr(s,2)}
        return int(x+0.5) substr(s,1,1)
    }
    {sub(/^[0-9]+/, human($1)); print}'

( আরও বিশেষায়িত প্রশ্ন থেকে পোস্ট করা )


ঠিক আছে, ধন্যবাদ. আপনার স্ক্রিপ্ট সম্পর্কে আমি মূলত এটি পছন্দ করি। কিছু বিষয় রয়েছে যা আমার দৃষ্টি আকর্ষণ করেছে: (1) ভেরের sনেতৃত্ব দেওয়া উচিত B। এছাড়াও এই স্ট্রিংটি সহজেই আইইসি বাইনারি স্বরলিপিতে পরিবর্তিত হয়। (2) এটি 1000-1023 পরিসীমাটি 1 <পরবর্তী আকারের> (সহজেই পরিবর্তিত) এর পক্ষে ছেড়ে যায় (3) এর দশমিক মান নেই (যা আমি চাই)। আবার এটি সহজেই পরিবর্তিত হয়। 2 দশমিক স্থান প্রদর্শন করার সময়, %fফর্ম্যাটটি 1019-1023round-up মানের জন্য <পরের আকার> এর কারণ হিসাবে ; তবে এটি কার্যকরভাবে মূল্যবান নয় .. আমি আমার রেফারেন্সের জন্য সাধারণ রেফারেন্সের জন্য একটি পরিবর্তিত সংস্করণ পোস্ট করেছি।
পিটার.ও

কোর্টিলস ব্যবহার করে ওএসএক্স হোমব্রিউ ব্যবহারকারীদের জন্য জিএনএমএফএমটি
ভের্বোজ করুন

যারা রূপান্তর করতে চান তাদের জন্য duপাঠযোগ্য বিন্যাসে সংখ্যা, যে আপনি যোগ করতে প্রয়োজন হতে পারে মনে রাখবেন --block-size=1করার duকমান্ড।
পাওয়াময়

68

ভি হিসাবে 8.21, coreutilsঅন্তর্ভুক্ত numfmt:

numfmtবিভিন্ন উপস্থাপনায় নম্বর পড়ে এবং অনুরোধ অনুসারে সেগুলি পুনরায় ফর্ম্যাট করে।
সর্বাধিক প্রচলিত ব্যবহার হ'ল সংখ্যাকে মানব প্রতিনিধিত্ব করে / থেকে রূপান্তর করা ।

যেমন

printf %s\\n 5607598768908 | numfmt --to=iec-i
5.2Ti

বিভিন্ন অন্যান্য উদাহরণ (ফিল্টারিং, ইনপুট / আউটপুট প্রক্রিয়াকরণ ইত্যাদি সহ) উপস্থাপন করা হয় এখানে


উপরন্তু, হিসাবে coreutilsবনাম। 8.24, numfmtঅনুরূপ ক্ষেত্র সীমার স্পেসিফিকেশনের সঙ্গে একাধিক ক্ষেত্র প্রক্রিয়া করতে পারি cut, এবং আউটপুট স্পষ্টতা সেটিং সমর্থন --formatবিকল্প
যেমন

numfmt --to=iec-i --field=2,4 --format='%.3f' <<<'tx: 180000 rx: 2000000'
tx: 175.782Ki rx: 1.908Mi

numfmt হল কোর্টিলস -8.21 এর পরে কোরিউটিলস প্যাকেজে নতুন যুক্ত হওয়া সরঞ্জাম।
জামা কুইস

1
এটি এখন স্বীকৃত উত্তর হওয়া উচিত।
অ্যান্ডি ফস্টার 19

23

এখানে কেবলমাত্র বাশ-এর ​​বিকল্প, কোনও bcবা অন্য কোনও অন্তর্নির্মিত, + দশমিক ফর্ম্যাট এবং বাইনারি ইউনিট রয়েছে।

bytesToHuman() {
    b=${1:-0}; d=''; s=0; S=(Bytes {K,M,G,T,P,E,Z,Y}iB)
    while ((b > 1024)); do
        d="$(printf ".%02d" $((b % 1024 * 100 / 1024)))"
        b=$((b / 1024))
        let s++
    done
    echo "$b$d ${S[$s]}"
}

উদাহরণ:

$ bytesToHuman 123456789
117.73 MiB

$ bytesToHuman 1000000000000 # "1TB of storage"
931.32 GiB                   #  1TB of storage

$ bytesToHuman 
0 Bytes

সেখানে বাশের যে কোনও সংস্করণে ভাল পারফরম্যান্স করা উচিত (উইন্ডোজের জন্য এমএসওয়াইএসজিট এর ব্যাশ সহ)।


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

@ উইনউইউছুস ২ ইউনিক্স ধন্যবাদ, আমি আনন্দিত যে এটি আপনার পক্ষে সহায়ক হয়েছিল :)
কামিলো মার্টিন

নোট করুন যে শেষ দুটি প্রত্যয়টি অদলবদল হয়েছে; একটি ইয়োটাবাইট আসলে জেটটাবাইটের চেয়ে বড়।
স্ট্যাটিকফ্লোট

6

এটি পিটার দ্বারা অনুপ্রাণিত একটি সম্পূর্ণ পুনর্লিখন O গিলসের অ্যাডক স্ক্রিপ্টের পরিবর্তিত সংস্করণ।

পরিবর্তন করুন:

  • পিটার.ও এর বাগটি যেখানে তিনি> 1 অক্ষরের স্ট্রিং খুঁজছেন যেখানে তার একটি> 4 অক্ষর সন্ধান করা উচিত Fix এই বাগের কারণে তার কোডটি জিবি ইউনিটগুলির পক্ষে কাজ করে না।
  • স্থান-পৃথক ইউনিট আকারের একটি দীর্ঘ স্ট্রিংয়ের খুব কুৎসিত হার্ডকোডিং সরিয়ে দেয়।
  • প্যাডিং সক্ষম / অক্ষম করতে কমান্ড লাইন সুইচগুলি যুক্ত করে।
  • বেস -1024 (কিবি) থেকে বেস -1000 (কেবি) স্বরলিপিতে যেতে কমান্ড লাইন সুইচগুলি যুক্ত করে।
  • এগুলি সমস্ত সহজে ব্যবহারযোগ্য ফাংশনে আবৃত করে।
  • আমি এটিকে সর্বজনীন ডোমেনে রাখি এবং ব্যাপক ব্যবহারকে স্বাগত জানাই।

কোড:

bytestohuman() {
    # converts a byte count to a human readable format in IEC binary notation (base-1024), rounded to two decimal places for anything larger than a byte. switchable to padded format and base-1000 if desired.
    local L_BYTES="${1:-0}"
    local L_PAD="${2:-no}"
    local L_BASE="${3:-1024}"
    BYTESTOHUMAN_RESULT=$(awk -v bytes="${L_BYTES}" -v pad="${L_PAD}" -v base="${L_BASE}" 'function human(x, pad, base) {
         if(base!=1024)base=1000
         basesuf=(base==1024)?"iB":"B"

         s="BKMGTEPYZ"
         while (x>=base && length(s)>1)
               {x/=base; s=substr(s,2)}
         s=substr(s,1,1)

         xf=(pad=="yes") ? ((s=="B")?"%5d   ":"%8.2f") : ((s=="B")?"%d":"%.2f")
         s=(s!="B") ? (s basesuf) : ((pad=="no") ? s : ((basesuf=="iB")?(s "  "):(s " ")))

         return sprintf( (xf " %s\n"), x, s)
      }
      BEGIN{print human(bytes, pad, base)}')
    return $?
}

পরীক্ষার কেস (যদি আপনি আউটপুটটি দেখতে চান):

bytestohuman 1; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 500; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 1023; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 1024; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 1500; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000000000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000000000000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000000000000000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000000000000000000; echo "${BYTESTOHUMAN_RESULT}.";

bytestohuman 1 no 1000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 500 no 1000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 1023 no 1000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 1024 no 1000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 1500 no 1000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000 no 1000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000000 no 1000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000000000 no 1000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000000000000 no 1000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000000000000000 no 1000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000000000000000000 no 1000; echo "${BYTESTOHUMAN_RESULT}.";

bytestohuman 1 yes; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 500 yes; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 1023 yes; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 1024 yes; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 1500 yes; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000 yes; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000000 yes; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000000000 yes; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000000000000 yes; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000000000000000 yes; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000000000000000000 yes; echo "${BYTESTOHUMAN_RESULT}.";

bytestohuman 1 yes 1000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 500 yes 1000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 1023 yes 1000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 1024 yes 1000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 1500 yes 1000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000 yes 1000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000000 yes 1000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000000000 yes 1000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000000000000 yes 1000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000000000000000 yes 1000; echo "${BYTESTOHUMAN_RESULT}.";
bytestohuman 150000000000000000000 yes 1000; echo "${BYTESTOHUMAN_RESULT}.";

উপভোগ করুন!


5

perlসিপিএএন-তে বেশ কয়েকটি মডিউল রয়েছে: ফর্ম্যাট :: হিউম্যান :: বাইটস এবং নাম্বার :: বাইটস :: হিউম্যান , দ্বিতীয়টি আরও কিছুটা সম্পূর্ণ:

$ echo 100 1000 100000 100000000 |
  perl -M'Number::Bytes::Human format_bytes' -pe 's/\d{3,}/format_bytes($&)/ge'
100 1000 98K 96M

$ echo 100 1000 100000 100000000 |
  perl -M'Number::Bytes::Human format_bytes' -pe 's/\d{3,}/
   format_bytes($&,bs=>1000, round_style => 'round', precision => 2)/ge'
100 1.00k 100k 100M

এবং বিপরীত:

$ echo 100 1.00k 100K 100M 1Z |
  perl -M'Number::Bytes::Human parse_bytes' -pe '
    s/[\d.]+[kKMGTPEZY]/parse_bytes($&)/ge'
100 1024 102400 104857600 1.18059162071741e+21

দ্রষ্টব্য: ফাংশনটি 0.09 সংস্করণে যুক্তparse_bytes() হয়েছিল (2013-03-01)


5

লিনাক্সের মাধ্যমে - বাইট গণনার জন্য কোনও কমান্ড লাইন ক্যালকুলেটর রয়েছে? - স্ট্যাক ওভারফ্লো , আমি জিএনইউ ইউনিটগুলি সম্পর্কে পেয়েছি - যদিও এসও পৃষ্ঠায় উদাহরণ ছাড়াই; এবং আমি এটি এখানে তালিকাভুক্ত দেখতে পাইনি, এটি সম্পর্কে এটি একটি ছোট নোট।

প্রথমে পরীক্ষা করুন যে ইউনিটগুলি উপস্থিত রয়েছে:

$ units --check-verbose |grep byte
doing 'byte'

$ units --check-verbose |grep mega
doing 'megalerg'
doing 'mega'

$ units --check-verbose |grep mebi
doing 'mebi'

দেওয়া হয়েছে যে, একটি রূপান্তর করুন - printfফর্ম্যাট স্পেসিফায়ার সংখ্যার ফলাফল ফর্ম্যাট করতে গৃহীত হয়:

$ units --one-line -o "%.15g" '20023450 bytes' 'megabytes'  # also --terse
    * 20.02345
$ units --one-line -o "%.15g" '20023450 bytes' 'mebibytes' 
    * 19.0958499908447
$ units --one-line -o "%.5g" '20023450 bytes' 'mebibytes' 
    * 19.096

3

আসলে, একটি ইউটিলিটি রয়েছে যা এটি ঠিক করে। আমি জানি এটা আমার লেখা ছিল। এটি * বিএসডি-র জন্য লেখা হয়েছিল তবে আপনার বিএসডি লাইব্রেরি থাকলে (যা আমি বিশ্বাস করি সাধারণ) লিনাক্সে সংকলন করা উচিত।

আমি সবেমাত্র একটি নতুন সংস্করণ প্রকাশ করেছি, এখানে পোস্ট করেছি:

http://blog.frankleonhardt.com/2015/freebsd-hr-utility-human-readable-number-filter-man-page/

একে HR বলা হয়, এবং এটি স্টিডিন (বা ফাইল) নেবে এবং সংখ্যাকে এমনভাবে এমনভাবে রূপান্তরিত করবে যেগুলি (এখন) ঠিক ls -h এর সমান এবং একইভাবে এটি পৃথক ফিডগুলি লাইন, স্কেলে নির্বাচন করতে পারে প্রাক-স্কেল করা ইউনিট (যেমন তারা 512-বাইট ব্লকগুলিতে এমবিতে রূপান্তর করে), কলাম প্যাডিং সামঞ্জস্য করুন ইত্যাদি।

আমি কয়েক বছর আগে এটি লিখেছিলাম কারণ আমি ভেবেছিলাম যে শেল স্ক্রিপ্ট লেখার চেষ্টা করা বুদ্ধিগতভাবে আকর্ষণীয় হলেও এটি ছিল একেবারে উন্মাদনা।

এইচআর ব্যবহার করে, উদাহরণস্বরূপ, আপনি সহজেই ডিরেক্টরি মাপের (বা 1 কেবি ইউনিটে আসে এবং রূপান্তর করার আগে স্থানান্তরিত হওয়া দরকার) এর একটি সাজানো তালিকা পেতে পারেন:

du -d1 | সাজানো-এন | hr -sK

যখন du -h আউটপুট উত্পাদন করবে, বাছাই করে এটি দ্বারা সাজানো হবে না। বিদ্যমান ইউটিলিটিগুলিতে -h সংযোজন ইউনিক্স দর্শনের অনুসরণ না করার একটি সর্বোত্তম ঘটনা: সাধারণ উপযোগিতাগুলি সত্যিই ভালভাবে সংযুক্ত করা উচিত have


2

এটি প্রায় বিশুদ্ধভাবে ব্যাশে করার একটি উপায় এখানে রয়েছে, ভাসমান পয়েন্ট গণিতের জন্য কেবল 'বিসি' প্রয়োজন।

function bytesToHR() {
        local SIZE=$1
        local UNITS="B KiB MiB GiB TiB PiB"
        for F in $UNITS; do
                local UNIT=$F
                test ${SIZE%.*} -lt 1024 && break;
                SIZE=$(echo "$SIZE / 1024" | bc -l)
        done

    if [ "$UNIT" == "B" ]; then
        printf "%4.0f    %s\n" $SIZE $UNIT
    else
        printf "%7.02f %s\n" $SIZE $UNIT
    fi
}

ব্যবহার:

bytesToHR 1
bytesToHR 1023
bytesToHR 1024
bytesToHR 12345
bytesToHR 123456
bytesToHR 1234567
bytesToHR 12345678

আউটপুট:

   1    B
1023    B
   1.00 KiB
  12.06 KiB
 120.56 KiB
   1.18 MiB
  11.77 MiB

1
user@host:/usr$ alias duh="du -s -B1 * | sort -g | numfmt --to=iec-i --format='%10f'"
user@host:/usr$ duh

দেয়:

 4.0Ki games
 3.9Mi local
  18Mi include
  20Mi sbin
 145Mi bin
 215Mi share
 325Mi src
 538Mi lib

দুর্ভাগ্যক্রমে আমি কীভাবে দুটি দশমিক নির্ভুলতা পেতে পারি তা বুঝতে পারি না। উবুন্টু 14.04 এ পরীক্ষিত।


1

@ don_crissti- এর প্রথম উত্তরটি ভাল, তবে এখানে স্ট্রিংস ব্যবহার করে আরও খাটো হতে পারে , যেমন

$ numfmt --to=iec-i <<< "12345"
13Ki

$ numfmt --to=iec-i --suffix=B <<< "1234567"
1.2MiB

অথবা এমনকি

$ numfmt --from=iec-i --to=iec-i --suffix=B <<< "12345Ki"
13MiB

যদি <<<না পাওয়া যায় তবে আপনি যেমন ব্যবহার করতে পারেন

$ echo "1234567" | numfmt --to=iec-i --suffix=B
1.2MiB

1

পাইথন সরঞ্জাম বিদ্যমান

$pip install humanfriendly  # Also available as a --user install in ~/.local/bin

$humanfriendly --format-size=2048
2.05 KB
$humanfriendly --format-number=2048
2,048

আমি একটি - বাইনারি পতাকা দেখতে পাচ্ছি না :(, সুতরাং আপনাকে বাইনারি উপস্থাপনের জন্য সরাসরি পাইথন ব্যবহার করতে হবে:

$python -c 'import sys, humanfriendly; print(humanfriendly.format_size(int(sys.argv[1]), binary=True))' 2048
2 KiB
$python -c 'import sys, humanfriendly; print(humanfriendly.format_size(int(sys.argv[1]), binary=True))' 2000
1.95 KiB

1

আমারও একই সমস্যা ছিল এবং আমি খুব শীঘ্রই awkএর log()কার্যকারিতাটি ব্যবহার করে একটি সহজ সমাধান নিয়ে এসেছি :

awk '
  BEGIN {
    split("B,kiB,MiB,GiB", suff, ",")
  }

  {
    size=$1;
    rank=int(log(size)/log(1024));
    printf "%.4g%s\n", size/(1024**rank), suff[rank+1]
  }
'

এবং ফ্লোট নম্বর ব্যবহার করতে গিয়ে যে নির্ভুলতা হারিয়েছিল তা তেমন খারাপ নয় কারণ যেহেতু সেই নির্ভুলতা যে কোনওভাবেই হারিয়ে যাবে।


0

আপনার প্রশ্নের উত্তর হ্যাঁ।

আউটপুট ফর্ম্যাটটি আপনার স্পেসিফিকেশনের সাথে ঠিক না হলেও রূপান্তরটি খুব সহজেই খুব মানক সরঞ্জাম (বা দুটি) দ্বারা সম্পন্ন হয় । আমি যার সাথে উল্লেখ করছি dcএবং হ'ল bc। তাদের আউটপুট রেডিকে পরিবর্তন করে আপনি একটি বিভাগযুক্ত প্রতিবেদন পেতে পারেন। এটার মত:

{   echo 1024 o           #set dc's output radix
    echo 1023 pc          #echo a number then print + clear commands
    echo 1024 pc
    echo 1025 pc
    echo 8000000 pc
} | dc

... যা ছাপায় ...

 1023                    #1 field 1023 bytes
 0001 0000               #2 fields 1k 0b
 0001 0001               #2 fields 1k 1b
 0007 0644 0512          #3 fields 7m 644k 512b or 7.64m

আমি dcউপরে ব্যবহার করেছি কারণ এটি একটি ব্যক্তিগত প্রিয়, তবে bcবিভিন্ন সিনট্যাক্সের সাথে একই কাজ করতে পারি এবং পসিক্স যেমন নির্দিষ্টভাবে একই ফর্ম্যাট নিয়ম মেনে চলে:

  • bc obase

    • ১ 16 এর বেশি বেসের জন্য, প্রতিটি অঙ্ক পৃথক একক-দশমিক দশমিক সংখ্যা হিসাবে লেখা হবে। সর্বাধিক উল্লেখযোগ্য ভগ্নাংশের সংখ্যা ব্যতীত প্রতিটি অঙ্কের আগে একটি একক স্পেস থাকবে । ১ to থেকে ১০০ পর্যন্ত বেসের জন্য, bcদুই-অঙ্কের দশমিক সংখ্যা লিখতে হবে; 101 থেকে 1000 অবধি, তিন-অঙ্কের দশমিক স্ট্রিং এবং এর জন্য। উদাহরণস্বরূপ, বেস 25 তে দশমিক সংখ্যা 1024 হিসাবে লিখিত হবে:

    01 15 24

    এবং বেস 125 এ, যেমন:

    008 024


-1

সংক্ষিপ্ত এবং মিষ্টি, শেল একমাত্র সমাধান:

convertB_human() {
NUMBER=$1
for DESIG in Bytes KB MB GB TB PB
do
   [ $NUMBER -lt 1024 ] && break
   let NUMBER=$NUMBER/1024
done
printf "%d %s\n" $NUMBER $DESIG
}

এটি দশমিক দর্শন প্রদর্শন করে না।

দ্য let VAR=expressionকর্ন-ইশ। VAR=$(( expression ))জন্ম-আবার-ইশ জন্য বিকল্প ।


এই সমাধানটি / 1024 সর্বদা রাউন্ড হিসাবে এক টন ত্রুটি পরিচয় করিয়ে দেয়, আমি নিশ্চিত যে আপনি 1.5 টিআইবি 2 টিবি-তে গোল করতে চান না।
জিওফ্রে

-2

আফাইক এমন কোনও মানক সরঞ্জাম নেই যার কাছে আপনি পাঠ্য পাস করতে পারেন এবং এটি একটি মানব পাঠযোগ্য ফর্মটি দেয়। আপনার ডিসট্রোর জন্য উল্লিখিত কাজটি সম্পাদন করার জন্য আপনি একটি প্যাকেজ খুঁজে পেতে সক্ষম হতে পারেন।

তবে আপনার কেন এমন একটি সরঞ্জাম প্রয়োজন হতে পারে তা আমি বুঝতে পারি না। বেশিরভাগ প্যাকেজ যা সম্পর্কিত আউটপুট দেয়, সাধারণত মানব-পঠনযোগ্য আউটপুট জন্য একটি -h বা সমমানের সুইচ থাকে।


1
বোঝার উদ্দেশ্যে: মানব-পঠনযোগ্য অর্থ কেবল এটি; মানুষের দ্বারা পঠনযোগ্য। আপনি যে সরঞ্জামগুলি উল্লেখ করেছেন তাতে প্রদর্শিত বিভিন্ন আকারের ইউনিটগুলি অগ্রগতি গণনার জন্য নয়, যার জন্য ইউনিটগুলির অভিন্নতা প্রয়োজনীয়। বাইটগুলির সাথে কাজ করা, যা সর্বদা পূর্ণসংখ্যাসমূহ, বশ তাদের সাথে কোনও পাটিগণিত করতে পারে এমন একমাত্র উপায় । তাই কি ... আছে নিরূপণ বাইট করা ... রিপোর্ট হিউম্যান যেমন,। "আপনি মোট ২.৪৪
জিআইবি

আমি মনে করি এটি আপনার প্রশ্নের অংশ হওয়া উচিত। আপনি সমস্যার সমাধান পেয়েছেন বলে মনে হচ্ছে। শুভকামনা।
শেল্টার

1
একটি সাধারণ অ্যাপ্লিকেশন হ'ল বাছাইয়ের জন্য সংখ্যক বাইট জেনারেট করা এবং বাছাইয়ের পরে মানব-পঠনযোগ্য ইউনিটে রূপান্তর করা।
গিলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.