আমি কি মাসে by ডু `গ্রুপযুক্ত করতে পারি?


14

এতে আমার প্রচুর ফটো সহ একটি ডিরেক্টরি রয়েছে। বিশেষত, du -sh --apparent-size /path/to/myfolderআমাকে 331G দেয়। যা মহান. তবে এখন আমি মাসের ভিত্তিতে একটি তালিকা তৈরি করতে চাই, উদাহরণস্বরূপ এই জাতীয় কিছু:

2016-01   20MB
2016-02  520MB
2016-03  312MB
...

লিনাক্স বিল্টিনগুলির সাথে এটি করার কোনও (যুক্তিসঙ্গত) উপায় আছে, বা এটি করার জন্য আমার নিজের পাইথন ইউটিলিটিটি লিখতে হবে?


1
লিনাক্সের বিল্টিন নেই , এটি একটি অপারেটিং সিস্টেম কার্নেল। পরিবর্তে কিছু লিনাক্স ভিত্তিক অপারেটিং সিস্টেমে (যেমন ডেবিয়ান, ফেডোরা, ChromeOS ...) কমান্ডগুলি ডিফল্টরূপে পাওয়া যায় ?
স্টাফেন চেজেলাস

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

1
@ ওয়েইনওয়ার্নার অন্য কথায়, আপনার অর্থ জিএনইউ / লিনাক্স, ব্যাশ, কোরয়েটিলস এবং জিএনইউ অপারেটিং পরিবেশের অন্যান্য মূল উপাদানগুলি সহ। #rmswasright
দামিয়ান ইয়ারিক

উত্তর:


23

লিনাক্সে, চেষ্টা করুন:

find /my/path -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]}' | sort

কিভাবে এটা কাজ করে

  • find /my/path

    এটি / আমার / পথে ফাইলগুলির সন্ধান করে।

  • -maxdepth 1

    এটি findসাব-ডিরেক্টরিতে সন্ধান না করার জন্য বলে । (আপনি যদি পুনরাবৃত্ত অনুসন্ধান করতে চান তবে এই বিকল্পটি বাদ দিন))

  • -type f

    এটি findঅনুসন্ধানগুলিকে নিয়মিত ফাইলগুলিতে সীমাবদ্ধ করতে বলে ।

  • -printf '%TY-%Tm %s\n'

    এটি findপ্রতিটি ফাইলের জন্য বাইট আকারের পরে বছর-মাসের মুদ্রণ করতে বলে ।

    যেহেতু তাদের জন্য আমাদের কোনও ব্যবহার নেই, তাই প্রাপ্ত ফাইলগুলির নাম মুদ্রিত হয় না।

  • b[$1]+=$2

    জন্য প্রতিটি ফাইল পাওয়া যায়, আমরা গণনা যে মিশুক অ্যারের মধ্যে যে বছর-মাসের সমন্বয় তার বাইট গণনা, কলাম 2 থেকে পাওয়া, অ্যাড b

  • END{for (date in b) print date, b[date]}

    আমরা এর থেকে সমস্ত আউটপুট প্রক্রিয়া করার পরে find, আমরা ফলাফলগুলি মুদ্রণ করি।

  • sort

    এটি তারিখের ক্রমে ফলাফলগুলি সাজায় orts

একাধিক লাইন সংস্করণ

যারা তাদের কোড পছন্দ করেন তাদের পক্ষে একাধিক লাইনে ছড়িয়ে পড়ে:

find /my/path -maxdepth 1 -type f -printf '%TY-%Tm %s\n' |
  awk '
    {
      b[$1]+=$2
    }

    END{
      for (date in b)
        print date, b[date]
    }
    ' | sort

উদাহরণ

আসুন এই ফাইলগুলির সাথে একটি ডিরেক্টরি বিবেচনা করুন:

$ ls -l
total 27816
-rw------- 1 john1024 john1024 2459173 Nov 23  2015 img100.jpg
-rw------- 1 john1024 john1024 3479750 Nov 23  2015 img101.jpg
-rw------- 1 john1024 john1024 4028939 Nov 23  2015 img102.jpg
-rw------- 1 john1024 john1024 2928519 Jul 30 18:55 img103.jpg
-rw------- 1 john1024 john1024 2948294 Jul 30 18:55 img104.jpg
-rw------- 1 john1024 john1024 3177583 Aug  1 16:56 img105.jpg
-rw-rw---- 1 john1024 john1024 3111737 Apr 18  2016 img106.jpg
-rw-rw---- 1 john1024 john1024 1441310 Apr 18  2016 img107.jpg
-rw-rw---- 1 john1024 john1024 2430158 Apr 25 16:26 img108.jpg
-rw-rw---- 1 john1024 john1024 2424504 Apr 25 16:26 img109.jpg

আমাদের কমান্ড থেকে আউটপুট হয়:

$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]}' | sort
2015-11 9967862
2016-04 9407709
2016-07 5876813
2016-08 3177583

পরিমার্জনা

যদি আমরা বাইটের পরিবর্তে আউটপুটটি মেবিবাইটে (এমআইবি) চাই, আমরা ইউনিটগুলিকে এই জাতীয় রূপান্তর করতে পারি:

$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]/1024**2, "MiB"}' | sort
2015-11 9.50609 MiB
2016-04 8.97189 MiB
2016-07 5.60457 MiB
2016-08 3.03038 MiB

আমরা আউটপুট ফর্ম্যাটটি ব্যবহার করে আরও নিয়ন্ত্রণ পেতে পারি printf। এখানে, দশমিক পয়েন্টের পরে মাত্র একটি অঙ্ক রাখতে, আমরা এর সাথে আকারটি ফর্ম্যাট করি %5.1f:

$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) printf "%s %5.1f MiB\n", date, b[date]/1024**2}' | sort
2015-11   9.5 MiB
2016-04   9.0 MiB
2016-07   5.6 MiB
2016-08   3.0 MiB

এটি চমৎকার. আপনি কি কোন অজানা টিউটোরিয়াল সুপারিশ করতে পারেন? আমি এখনও এমন কোনও সন্ধান পাইনি যা আমার চোখটিকে প্রায় বিশ সেকেন্ডের মধ্যে অতিক্রম করে নি।
hBy2Py

1
@ hBy2Py আমার প্রিয় অবতীর্ণতার পরিচিতি, যদিও এখন এটি কিছুটা সময়সীমার পরেও গ্রিমোয়ার টিউটোরিয়াল
1024

আমি দ্বিতীয় কলামে স্থান প্যাডিং যুক্ত করার printf "%s %9d\n", date, b[date]পরিবর্তে ব্যবহার করার পরামর্শ দিচ্ছিprint date, b[date]
rav_kr

@ আরভ_কিআর ভাল ধারণা। আমি উত্তরটি ব্যবহার করে এমন একটি উদাহরণ দিয়ে আপডেট করেছি printf
1024

FWIW যদি আপনি findযে সমর্থন -maxdepthআপনি সম্ভবত আছে [g]awkযে সমর্থনPROC_INFO["sorted_in"]="@ind_str_asc"
dave_thompson_085
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.