মানুষের পাঠযোগ্য আকারকে কীভাবে সাজান


11

আমি মূলত ফাইলগুলি খুঁজছি তারপর আকার অনুসারে বাছাই করছি। স্ক্রিপ্টটি যদি আমি মানব পঠনযোগ্য অনুসারে আকার বাছাই না করে তবে কাজ করে। তবে আমি আকারটি মানব পাঠযোগ্য হতে চাই। আমি যে আকারগুলি মানুষের পাঠযোগ্য তা বাছাই করতে পারি?

উদাহরণ স্বরূপ:

 ls -l | sort -k 5 -n | awk '{print $9 " " $5}'

এটি প্রত্যাশার মতো কাজ করে, আমি আমার ফাইলগুলির আকার বর্ধনে আরোহণ করেছি:

1.txt 1
test.txt 3
bash.sh* 573
DocGeneration.txt 1131
andres_stuff.txt 1465
Branches.xlsx 15087
foo 23735
bar 60566
2016_stuff.pdf 996850

এখন, আমি আকারটি মানব পাঠযোগ্য হতে চাই, তাই আমি এল-এ একটি -h প্যারামিটার যুক্ত করেছি, এবং এখন কয়েকটি ফাইলের ব্যবস্থা নেই:

 ls -lh | sort -k 5 -n | awk '{print $9 " " $5}'
1.txt 1
DocGeneration.txt 1.2K
andres_stuff.txt 1.5K
test.txt 3
Branches.xlsx 15K
foo 24K
bar 60K
bash.sh* 573
2016_stuff.pdf 974K


-k 5- ওটা কিভাবে কাজ করে?
ctrl-alt-delor

@ সিটিআরএল-ওল্ট-ডেলর: আমি বিশ্বাস করি যে আকারটি lsআউটপুটটির 5 ম কলামে রয়েছে
jesse_b

2
duপরিবর্তে ব্যবহার করা lsভাল ধারণা হতে পারে।
xenoid

... অথবা find'র -printfতার সঙ্গে %pএবং %sformatters (ক আকারের "humanisation" দ্বারা অনুসৃত)।
স্টিফেন কিট

@ জেসি_বি আমার ত্রুটি, আমি কেবল ধরে নিয়েছি যে প্রশ্নের ডেটা (এটি যা পেয়েছিল তা হিসাবে চিহ্নিত করা হয়েছে) বাছাই করা ইনপুট ছিল I আমি ভুল ছিল।
ctrl-alt-delor

উত্তর:


28

চেষ্টা sort -h k2

-হ, --হুমান-সংখ্যাসূচক - মানব পাঠযোগ্য সংখ্যাগুলির তুলনা করুন (উদাহরণস্বরূপ, 2 কে 1 জি)

এটি gnu সাজ্ট, BSD সাজান, এবং অন্যান্য অংশ।


5
আউটপুট পার্সিং lsএড়ানো উচিত নয়?

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

1
ব্লুডগেইন, এলএস ফর্ম্যাটটি সিস্টেম / এলএস বাইনারিগুলির মধ্যে একইরূপে গ্যারান্টিযুক্ত নয়, সুতরাং এটি বহনযোগ্যভাবে পার্স করা অসম্ভব বলে মনে করা হয়।
ডি বেন নোবল


1
ব্লুডগেইন: files=(); for f in *; do [[ -L "$f" ]] && files+=("$f"); done; echo ${#files[@]}(আমার কাছে এটি একটি সিমিলিংক পরীক্ষার স্যুইচ ভুল হতে পারে)। আপনি যদি সিমলিঙ্কগুলির বিষয়ে চিন্তা না করেন files=(*); echo ${#files[@]}, যা আপনি setঅ্যারে ব্যবহার না করে এবং যদি ব্যবহার না করেন তবে পোর্টেবল হয়ে যায় ।
ডি বেন নোবল

29

lsএই কার্যকারিতাটি অন্তর্নির্মিত হয়েছে, -Sবিকল্পটি ব্যবহার করুন এবং বিপরীত ক্রমে সাজান:ls -lShr

       -r, --reverse
              reverse order while sorting

       -S     sort by file size, largest first

1
-hকোনও মানক lsবিকল্প নয় , তবে ওপি যদি ইতিমধ্যে এটি ব্যবহার করে তবে অবশ্যই তা ব্যবহারযোগ্য be বাকিগুলি মানসম্পন্ন, এবং অবশ্যই উত্তরটি আমি লিখেছি।
টবি স্পিড

5
+1 এর আউটপুট পার্সিংয়ের বিষয়ে গোলমাল করবেন না ls
ডেভিড রিচার্বি

এটি সেরা উত্তর, তবে এটি @ টবির মন্তব্যে তথ্য অন্তর্ভুক্ত করা উচিত: -Sআপনার জন্য এটি উপলব্ধ নাও হতে পারে ls। এফডাব্লুআইডাব্লু, -Sএমনকি ইমাসের লাইব্রেরি সহ সমর্থিত ls-lisp.el, যা ওএসের কোনও নেই যখন ব্যবহৃত হয় ls। উদাহরণস্বরূপ, এটি এমএস উইন্ডোজের ইমাসগুলিতে কাজ করে।
ড্র হয়েছে

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
ছড়িয়ে ছিটিয়ে

1
@ ড্রু: টবির মন্তব্য বলে যে -hএটি সর্বজনীনভাবে উপলভ্য নাও হতে পারে, তবে ওপি ইতিমধ্যে যাইহোক এটি ব্যবহার করছে। -Sসত্যই সর্বজনীনভাবে উপলব্ধ হওয়া উচিত , কারণ এটি পবি লিংকের মধ্যে যা টবি সরবরাহ করে। তবে, বেশ কয়েকটি অ-পসিক্স টুলকিটগুলি সেখানে উপস্থিত রয়েছে।
কেভিন

5

যেহেতু কোনও নির্দিষ্ট শেল উল্লেখ করা হয়নি, শেলটিতে কীভাবে পুরো জিনিসটি করা যায় তা এখানে zsh:

ls -lhf **/*(.Lk-1024oL)

**মত উল্লিখিত glob ধরণের সাথে মেলা *কিন্তু জুড়ে /মত pathnames মধ্যে, অর্থাত্ একটি recursive সার্চ করতে হবে।

lsকমান্ড মানুষের পাঠযোগ্য মাপ সক্ষম করবে -h, এবং দীর্ঘ তালিকা আউটপুট ফরম্যাট -l-fবিকল্প অক্ষম বাছাই, তাই lsশুধু অর্ডার তারা দেওয়া হয় ফাইল তালিকা প্রস্তুত করবে।

এই আদেশটি **/*(.Lk-1024oL)ফাইলনাম গ্লোব্বিং প্যাটার্ন দ্বারা সাজানো হয়েছে যাতে ছোট ফাইলগুলি প্রথমে তালিকাবদ্ধ থাকে। **/*বিট এই ডিরেক্টরির করে নিচের প্রতিটি ফাইল এবং ডিরেক্টরির সাথে মিলে যায়, কিন্তু (...)মডিফাই উল্লিখিত glob আচরণ (এটা একটি "উল্লিখিত glob কোয়ালিফায়ার" এর)।

এটি oLশেষে যে oফাইলগুলির আকার ( L, "দৈর্ঘ্য") দ্বারা নামগুলি অর্ডার করে ( )।

.শুরুতে উল্লিখিত glob শুধুমাত্র নিয়মিত ফাইল (কোন ডিরেক্টরি) মেলে তোলে।

Lk-1024বিট নির্বাচন ফাইল যার আকার কম 1024 কিলোবাইট ( "1024 কম কিলোবাইট দৈর্ঘ্যের")।

যদি zshআপনার প্রাথমিক ইন্টারেক্টিভ শেল না হয় তবে আপনি ব্যবহার করতে পারেন

zsh -c 'ls -lf **/*(.Lk-1024oL)'

লুকানো নামগুলিও মেলে setopt GLOB_DOTS(বা zsh -o GLOB_DOTS -c ...) ব্যবহার করুন । ... বা কেবল Dগ্লোব কোয়ালিফায়ার স্ট্রিংয়ে যুক্ত করুন।


উপরের দিকটি প্রসারিত করে ধরে নেওয়া, আপনি পাথের নাম এবং মানব পাঠযোগ্য আকারের সাথে একটি 2-কলাম আউটপুট চাইবেন এবং ধরে numfmtনিবেন যে আপনি জিএনইউ কোর্টিলস থেকে পেয়েছেন,

zmodload -F zsh/stat b:zstat

for pathname in **/*(.Lk-1024oL); do
    printf '%s\t%s\n' "$pathname" "$(zstat +size "$pathname" | numfmt --to=iec)"
done

বা, দ্রুত,

paste <( printf '%s\n' **/*(.Lk-1024oL) ) \
      <( zstat -N +size **/*(.Lk-1024oL) | numfmt --to=iec )

4

যদি আপনার sortকাছে -hবিকল্প না থাকে তবে আপনি নীচের মতো একটি (খুব দীর্ঘ হলেও) অর্ড কমান্ডটি ব্যবহার করতে পারেন:

find . -type f -size -1024k -exec ls -al {} \; | sort -k 5 -n | awk '{if ($5 > 1099511627776) {print $9,$5/1024/1024/1024/1024"T"} else if ($5 > 1073741824) {print $9,$5/1024/1024/1024"G"} else if ($5 > 1048576) {print $9,$5/1024/1024"M"} else if ($5 > 1024) {print $9,$5/1024"K"} else {print $9,$5"B"}}' | column -t

এটি আপনার আউটপুটকে বাইটে সাজিয়ে রাখবে এবং তারপরে এগুলি তাদের মানব পাঠযোগ্য আকারে রূপান্তর করবে।


-1

এই কাজ করবে?

ls -l | awk '{if ($5<=1024) {print}}' | sort -k 5 -n | awk '{print $9"\t"substr($5/1024,1,3)"k"} '| column -t

প্রথম awkএক্সপ্রেসটি 1M এর চেয়ে কম ফাইলগুলি সন্ধান করবে এবং দ্বিতীয়টি ফলাফল থেকে বাইট আকার নেবে এবং কেবিতে রূপান্তর করবে এবং মানব-পঠনযোগ্য আকার দেওয়ার জন্য প্রথম 3 উপাদানকে মুদ্রণ করবে।


এটি আসলে ওপিএস প্রশ্নের সমাধান করে না - এটি কেবলমাত্র বর্তমান ডিরেক্টরিতে দেখায় এবং কেবল নিয়মিত ফাইলগুলি মুদ্রণ করবে will 1Mb এর পরিবর্তে 1Kb এর সাথে তুলনা করবে। শেষ পর্যন্ত আমরা কোড কেন কাজ করে সে সম্পর্কে কিছু ব্যাখ্যা সহ উত্তরের পরে রয়েছি।
গ্রোচমাল

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