ডিরেক্টরি ট্রিটিতে একটি নির্দিষ্ট বর্ধনের সমস্ত ফাইলের আকার


17

আমি আমার হোম ফোল্ডারে .o এক্সটেনশন (অবজেক্ট ফাইল) সহ ফাইলের আকার জানতে চাই।

আমি সমস্ত অবজেক্ট ফাইল ব্যবহার করে খুঁজে পেতে পারি

find . -name '*.o'

আমি এখন কীভাবে এই ফাইলগুলির মোট আকার গণনা করতে পারি?

উত্তর:


24

আপনি পাইপ ( |) সন্ধান করছেন। এগুলি একাধিক কমান্ড সংযুক্ত করার এবং একটি কমান্ডের আউটপুটকে অন্য ইনপুট হিসাবে পাস করার একটি উপায়। এই ক্ষেত্রে, আপনি ইনপুট হিসাবে খুঁজে পাওয়া সমস্ত ফাইলের নাম পাসওয়ার্ড করতে চান du(যা আকারের গণনা করে)। তবে duফাইলের নাম প্রত্যাশা করে এবং ফলাফলগুলি findকেবলমাত্র পাঠ্যের একটি তালিকা (হ্যাঁ, পাঠ্যটি ফাইলের নামগুলি ধারণ করে, তবে duএটি জানতে পারে না যে এটি সমস্ত কিছুই দেখায় এটি হ'ল পাঠ্য), আপনাকে এমন কিছু ব্যবহার করতে xargsহবে যা প্রতিটি গ্রহণ করবে পাঠ্য লাইন, এটি একটি ফাইল নাম হিসাবে বিবেচনা করুন এবং এটি পাস du। এই সমস্ত একসাথে রেখে, আমরা পাই:

find . -name "*.o" | xargs du -sch
  • আপনার দেওয়া প্যাটার্নগুলি সর্বদা উদ্ধৃত করা উচিত find(যেমন আমি উপরে করেছি "*.o":)। যদি আপনি এটি না করেন তবে শেলটি *.oবর্তমান ডিরেক্টরিতে কোনও মিল থাকা ফাইলের নামের সাথে প্রসারিত করবে । এটি কেবলমাত্র আপনার ক্ষেত্রে ম্যাচের কোনও ফাইল না থাকার কারণে এটি কাজ করে।

  • এর -schজন্য পতাকাগুলি duএখানে নথিভুক্ত করা হয় man du:

    -c, --total
          produce a grand total
    -h, --human-readable
          print sizes in human readable format (e.g., 1K 234M 2G)
    -s, --summarize
          display only a total for each argument
    

তবে নোট করুন, তবে সাদা স্থান সহ ফাইলের নামের জন্য এটি ব্যর্থ হবে। এটি অবশ্যই অবজেক্ট ফাইলগুলির জন্য একটি সমস্যা হয়ে উঠবে না, তবে ভবিষ্যতে, আপনার যদি ফাঁকা জায়গাগুলি নিয়ে কাজ করার প্রয়োজন হয় তবেও ব্যবহার করুন:

find . -name "*.o" -print0 | xargs -0 du -sch

-print0তোলে findশূন্য বিভাজিত লাইন মুদ্রণ এবং -0তোলে xargsইনপুট হিসাবে যেমন লাইন নিতে।

বিকল্পভাবে, আপনি findনিজেই আকারগুলি মুদ্রণ করতে পারেন এবং তারপরে তাদের যোগ করতে পারেন:

find . -name "*.o" -printf '%s\n' | awk '{c+=$1}END{print c}'

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


আপনি যদি ব্যবহার করছেন bash(আপনি সম্ভবত আছেন) তবে একটি সহজ উপায় রয়েছে:

shopt -s globstar 
du -sch **/*.o

shopt globstarকমান্ড তোলে **সমস্ত ফাইল ও বা একাধিক সাব মেলে। এটি সক্ষম করার পরে, **/*.oসমস্ত ফাইল (এবং ডিরেক্টরিগুলির) সাথে মিলবে যার নাম শেষ হয় .o, তাই আমরা এটিকে সরাসরি প্রেরণ করতে পারি du

নোট করুন, findপদ্ধতির বিপরীতে, এটি লুকানো ফাইলগুলির সাথে মেলে না (যাদের নাম a দিয়ে শুরু হয় .)। এগুলিও মিলে যাওয়ার জন্য, করুন:

shopt -s dotglob globstar
du -sch **/*.o

প্রথমটি নিয়ে কিছুটা সমস্যা আছে। MAXARGS এর মতো জিনিস রয়েছে। সুতরাং একাধিক পুনরাবৃত্তি duহবে এবং এটি একাধিক totalলাইন তৈরি করবে । এখানে উদাহরণ আছে: paste.ubuntu.com/23092752
Sergiy Kolodyazhnyy

@ সার্গ সত্য আমি অন্য একটি বিকল্প যুক্ত করেছি যা এড়ানো যায়।
টেরডন

আপনার প্রথম shopt globstarউদাহরণটি বাদ দেয় -s; আমি shopt -s globstarআপনার দ্বিতীয় উদাহরণ অনুরূপ ব্যবহার করতে হবে ।
ক্রেজিপাইরো

পছন্দ করুন দুঃখিত, এটি একটি টাইপ ছিল। এটা ইশারা জন্য ধন্যবাদ। shopt OPTIONএকটি -sবা একটি -u(বা অন্য বিকল্প ছাড়া, দেখুন help shopt) কেবলমাত্র বিকল্পের বর্তমান মানটি মুদ্রণ করে। আপনার একটি shopt -s OPTIONচালু করতে হবে এবং shopt -u OPTIONএটি বন্ধ করতে হবে।
টেরডন

8

কমান্ড -exec চালাতে পতাকা ব্যবহার করুন (প্রতিটি ফাইলের অর্থ)du;

find . -name "*.o" -exec du -b {} \; | awk '{total+=$1}END{print total}' 

নমুনা আউটপুট:

$ find . -name "*.txt"  -exec du -b {} \; | awk '{total+=$1}END{print total,"bytes" }'                                     
find: ‘./.cache/gvfs-burn’: Permission denied
find: ‘./.cache/unity’: Permission denied
852690242 bytes

findপুনরাবৃত্ত - এর অর্থ এটি সমস্ত উপ-ডিরেক্টরিতে চলে। আপনি যদি *.oবর্তমান ডিরেক্টরিতে সমস্ত ফাইল মোট পেতে চান তবে ঠিক করুন

du -b -c *.o

0

পার্ল সহ:

perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf

বর্তমান ডিরেক্টরিতে থাকা সমস্ত অ-লুকানো পিডিএফ ফাইলের আকার।


1
ঠিক আছে, তবে ওপি .oফাইলগুলি সন্ধান করছে এবং সেগুলি সাব-ডিরেক্টরিতে থাকতে পারে। প্রতিটি পুনরাবৃত্তির জন্য যোগফল মুদ্রণ এড়াতে আপনি এর }{আগেও যুক্ত করতে চাইতে পারেন print $sum। আমরা কেবল শেষটিই চাই।
টেরডন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.