আমি কীভাবে ফাইলগুলি খুঁজে পেতে পারি এবং সেগুলির আকারগুলি মোট কীভাবে পাই?


12

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

এটার মতো কিছু:

$ find . -name 'flibble*' -ctime +90 -exec du -sh {} \;

2.1G    ./flibble_116.log
2.1G    ./flibble_83.log
2.1G    ./flibble_211040_157.log
2.1G    ./flibble3747_51.log

এই কাজ. তবে আমি যে ফলাফলটি খুঁজছি তা ফল দেয় না। এটি প্রতিটি ফাইলের দ্বারা ব্যবহৃত স্থানকে তালিকাবদ্ধ করে যেমন findতাদের মাধ্যমে পুনরাবৃত্তি হয়।

আমি যা চাই তা duপাওয়া সমস্ত ফাইলের মোট ।

উত্তর:


12

সমাধান

বিকল্পটি -c(বা --total) সরবরাহ করে du(1)আপনি এটিকে একটি দুর্দান্ত মোট উত্পাদন করতে নির্দেশ দিতে পারেন। যদি আপনার প্রয়োগটি du(1)এই বিকল্পগুলির মধ্যে দুটিকে সমর্থন করে তবে আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করে পছন্দসই প্রভাব অর্জন করতে পারেন:

$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +

সম্পাদনা: নোট করুন যে ফাইলগুলির সংখ্যা যদি আপনার সিস্টেম দ্বারা অনুমোদিত প্যারামিটারের সর্বাধিক সংখ্যার বেশি হয়ে যায়, findতবুও commandএকাধিকবার কার্যকর করা যেতে পারে । কিছু বাস্তবায়ন du(1)ফাইল থেকে ফাইলের নামগুলি পড়াও সমর্থন করে যা উল্লিখিত সীমাবদ্ধতায় ভুগছে না:

$ find -name 'flibble*' -ctime +90 -print0 > filenames
$ du -shc --files0-from=filenames

ব্যাখ্যা

শব্দার্থবিজ্ঞানের মধ্যে পার্থক্য -exec command {} \;এবং -exec command {} +নিম্নলিখিতটি:

  • command {} \;commandপ্রতিটি ফলাফলের জন্য একবার চালায় find। ফলাফলের পথের পরিবর্তে পাস করা হয়েছে {}

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} \;
    1
    2
    3
    
  • command {} +কার্যকর করা হয় command, যখন সমস্ত ফলাফল পুনরুদ্ধার করা হয়। পরিবর্তে ফলাফলের নামগুলি পাস করা হয় {}

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} +
    1 2 3
    

-print0বিকল্প ঘটায় find(1)মান আউটপুট নাল অক্ষর দ্বারা পৃথক পাওয়া ফাইলের নামের প্রিন্ট করতে, এবং --files0-fromবিকল্প সৃষ্ট du(1)নাল বিভাজিত ফাইলের নামের পড়তে। নতুন লাইন চরিত্রের বিপরীতে নাল অক্ষরটি কোনও ফাইলের নাম হিসাবে উপস্থিত নাও হতে পারে, সুতরাং আউটপুটটি দ্ব্যর্থহীন।

এর বিকল্পগুলি সম্পর্কে আরো জানতে du(1)এবং find(1), আপনি নিজ নিজ manpages পরামর্শ করা উচিত:

$ man du
$ man find

2
কমান্ড লাইন আর্গুমেন্ট সীমাবদ্ধতার কারণে ফাইলগুলির সংখ্যা গুরুত্বপূর্ণ (1 কে +) গুরুত্বপূর্ণ হলে আপনি একাধিক মোটের সমাপ্তি পেতে পারেন।
ychaouche

আমি @ ইয়ছেউচে নিশ্চিত করতে পারি, 30k এর বেশি ফাইলের আকার নির্ধারণের চেষ্টা করার সময় আমি সমস্যা পেয়েছি।
অ্যাড্রিয়েন এইচ

যদি একটি বিষয় আছে, কিছু বাস্তবায়নের du(1)একটি ফাইল থেকে ফাইলের নামের পড়া সমর্থন করি: find 1 2 3 -maxdepth 0 -print0 > filenames; du -shc --files0-from=filenames
উইটিকো

4

এটা চেষ্টা কর:

du -c `find . -name 'flibble*' -ctime +90` | tail -1

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


এটি শূন্যস্থানযুক্ত পথের নামগুলির সাথে সঠিক ফলাফল আনবে না। এটি করার সঠিক উপায়টি হ'ল -exec du -c {} +বিকল্পটি ব্যবহার করা হচ্ছে findযা পাথের নামগুলি অপরিবর্তিত রাখবে du
উইটিকো

4

আপনি এটি চেষ্টা করতে পারেন:

find . -name 'flibble*' -ctime +90 -exec du -ch {} + | grep total

2

আমি findনিজেই আকারটি মুদ্রণ করতে এবং মোট হিসাব করার জন্য অন্য একটি সরঞ্জাম ব্যবহার করব:

find . -name 'flibble*' -ctime +90 -printf "%s\n" |
perl -lnE '$sum += $_} END {say $sum'

আপনি যদি ফাইলের নামও দেখতে চান:

find . -name 'flibble*' -ctime +90 -printf "%s\t%p\n" |
perl -apE '$sum += $F[0]} END {say $sum'

1

একটি সিস্টেমা যা বেশিরভাগ সিস্টেমে গিগাবাইট মোট পেতে কাজ করা উচিত:

echo "$(( ($(find . -name 'flibble*' -ctime +90 -type f -printf '%k+' )0)/1024/1024 )) GB"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.