প্রকৃত ডিরেক্টরি আকার (ডু আউট) কীভাবে পাবেন?


17

ইউনিক্স / লিনাক্স স্ট্যান্ডার্ড সরঞ্জাম ব্যবহার করে আমি কীভাবে প্রকৃত ডিরেক্টরি আকার পেতে পারি?

বিকল্প প্রশ্ন: আমাকে প্রকৃত ডিরেক্টরি আকার (ডিস্কের ব্যবহার নয়) দেখানোর জন্য আমি কীভাবে ডু পাব ?

যেহেতু লোকেরা "আকার" শব্দের বিভিন্ন সংজ্ঞা রয়েছে বলে মনে হয়: "ডিরেক্টরি আকার" এর আমার সংজ্ঞাটি সেই ডিরেক্টরিতে থাকা সমস্ত নিয়মিত ফাইলের যোগফল।

ডিরেক্টরিটি ইনোডের আকার বা ফাইলগুলি যে কোনও ফাইল (ব্লক * ব্লক আকার) সম্পর্কিত ফাইলগুলি সংশ্লিষ্ট ফাইল সিস্টেমে গ্রহণ করে না। 3 টি ফাইল, প্রতিটি বাইট প্রতিটি দিয়ে একটি ডিরেক্টরিতে 3 বাইটের ডিরেক্টরি মাপ থাকে (আমার সংজ্ঞায়)।

Du ব্যবহার করে ডিরেক্টরি আকারের গণনা করা অবিশ্বাস্য বলে মনে হচ্ছে।
উদাহরণস্বরূপ, mkdir foo && du -b fooপ্রতিবেদনগুলি "4096 foo", 0 বাইটের পরিবর্তে 4096 বাইট। খুব বড় ডিরেক্টরি সহ ডিরেক্টরি সূচিত du -hs100 গিগাবাইট (!) এবং আরও বেশি (সংকোচিত ফাইল সিস্টেম) দ্বারা বন্ধ করা যেতে পারে।

তাহলে প্রকৃত ডিরেক্টরি আকার পেতে কি (সরঞ্জাম / বিকল্প) ব্যবহার করতে হবে?


নতুন জায়গায় কোন ফাইল সিস্টেম ব্যবহার করা হয় - এটি কি xfsকোনও সুযোগেই রয়েছে?
সের্গেই ভ্লাসভ


এবং যদি আপনার নতুন এফএসটি সত্যই এক্সএফএস হয় তবে সম্ভবত ডিস্কের ব্যবহারের ফলে ফাইলের খণ্ডন হ্রাস হ্রাসকারী ডিস্কের ব্যবহার সম্ভবত আক্রমণাত্মক পূর্বনির্ধারণের কারণে ।
সের্গেই ভ্লাসভ

উত্তর:


8

এখানে একটি স্ক্রিপ্ট রয়েছে যা ইউনিক্স স্ট্যান্ডার্ড সরঞ্জামগুলি (পসিক্স) ব্যবহার করে একটি মানব পাঠযোগ্য ডিরেক্টরি আকার প্রদর্শন করে।

#!/bin/sh
find ${1:-.} -type f -exec ls -lnq {} \+ | awk '
BEGIN {sum=0} # initialization for clarity and safety
function pp() {
  u="+Ki+Mi+Gi+Ti+Pi+Ei";
  split(u,unit,"+");
  v=sum;
  for(i=1;i<7;i++) {
    if(v<1024) break;
    v/=1024;
  }
  printf("%.3f %sB\n", v, unit[i]);
}
{sum+=$5}
END{pp()}'

উদাহরণ:

$ ds ~        
72.891 GiB

এবং এখন আমি অন্য কোনো বিকল্প যা সব প্রস্তাব অনুপস্থিত পাওয়া lsএখানে পারস্পরিক আমন্ত্রণ: -q। এই বিকল্পটি ব্যতীত স্ক্রিপ্টটি ভেঙে যাবে যদি কোনও ফাইলের নামটিতে নতুন লাইন অক্ষর থাকে। সত্যিই নির্ভরযোগ্য শেল স্ক্রিপ্টগুলি লেখা খুব শক্ত ...
সের্গেই ভ্লাসভ

@ সের্গেভ্লাসভ আমি যে স্ক্রিপ্টটি পোস্ট করেছি তাতে কেবল অতিরিক্ত লাইন উপেক্ষা করে এ জাতীয় ফাইলগুলি ভাঙা উচিত নয়। কেবলমাত্র সমস্যার ক্ষেত্রে দেখা দিতে হবে যদি সাবধানে তৈরি করা ফাইলটির একটি অতিরিক্ত লাইন পঞ্চম কোলন থাকে যেখানে একটি সংখ্যার মান থাকে contains আপনার পরামর্শ প্রকৃতপক্ষে পরিস্থিতি এড়াতে হবে। টিপটির জন্য ধন্যবাদ, স্ক্রিপ্ট আপডেট হয়েছে।
jlliagre

অসাধারণ উত্তর। +1 টি আপনাকে স্যার
Ehime

এটি সবচেয়ে নির্ভরযোগ্য সমাধানগুলির মধ্যে একটি। এটি ফাইলের নামের সাথে কাজ করে যার মধ্যে শূন্যস্থান বা উদ্ধৃতি রয়েছে এবং এটি একটি মানব-পঠনযোগ্য আকার মুদ্রণ করে।
বেসিক 6

@ কেআইএজে আমার কোডটি পর্যালোচনা এবং ঠিক করার জন্য ধন্যবাদ!
jlliagre

8

কিছু সংস্করণ duআর্গুমেন্টকে --apparent-sizeডিস্ক ব্যবহারের পরিবর্তে আপাত আকার দেখানোর জন্য সমর্থন করে । সুতরাং আপনার আদেশ হবে:

du -hs --apparent-size

উবুন্টু 12.04 এলটিএস সহ ডু এর ম্যান পেজগুলি থেকে:

--apparent-size
      print apparent sizes,  rather  than  disk  usage;  although  the
      apparent  size is usually smaller, it may be larger due to holes
      in (`sparse') files, internal  fragmentation,  indirect  blocks,
      and the like

1
কাজ করে না: খালি ডায়ারদের জন্য কিছু স্থানের প্রতিবেদন করুন
কার্ল ফোনার

1
এটি আমার জন্য কাজ করেছে।
কনারবোড

2
আপনি বিভিন্ন ফাইল সিস্টেমে ডিরেক্টরিগুলির তুলনা করার সময় এটি বিভিন্ন ধরণের আকার দেয়। উদাহরণস্বরূপ, একই ফোল্ডারের zfs ফাইল সিস্টেমে 290Gb এবং এক্সফ্যাট 324Gb এর আপাত আকার রয়েছে। উপরের সমাধানগুলি একই আকার দেয়।
পিক্সাস.রু

4

কেবলমাত্র একটি বিকল্প, ব্যবহার করে ls:

ls -nR | grep -v '^d' | awk '{total += $5} END {print total, "Total"}'

ls -nR: -nপছন্দ করুন -lতবে সংখ্যার ইউআইডি এবং জিআইডি -Rতালিকাভুক্ত করুন এবং সাব-ডাইরেক্টরিগুলি পুনরাবৃত্তভাবে তালিকাবদ্ধ করুন ।

grep -v:মিল না-পাওয়া লাইনগুলি নির্বাচন করতে, মিলের অনুভূতিটি উল্টান। (-ভিটি পসিক্স দ্বারা নির্দিষ্ট করা আছে)) '^ d'ডিরেক্টরিগুলি বাদ দেবে।

Ls কমান্ড: http://linux.about.com/od/commands/l/blcmdl1_ls.htm

ম্যান গ্রেপ: http://linux.die.net/man/1/grep

সম্পাদনা :

পরামর্শ হিসাবে সম্পাদনা করেছেন @ সের্গেই ভ্লাসভ।


ব্যবহার -nজন্য বিকল্প lsপরিবর্তে -l, (নাম বদলে ইউআইডি / GID সংখ্যার দেখান) নিরাপদ কারণ ব্যবহারকারী এবং গ্রুপ নাম স্পেস থাকতে পারে (যেমন, যদি winbindবা sssdউইন্ডোজ ডোমেনে সিস্টেম যোগদানের জন্য ব্যবহার করা হয়, তোমার মত গ্রুপ নাম পেতে পারেন domain users) । ব্যবহারকারী এবং গোষ্ঠীর নামগুলি অনুসন্ধানের প্রয়োজন না হওয়ার কারণে এটি আরও দ্রুত হওয়া উচিত।
সের্গেই ভ্লাসাভ

ধন্যবাদ, এটি অনুসন্ধান-এক্সেক এলএসের চেয়ে অনেক বেশি দ্রুত!
gpothier

4

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

find . -type f -print0 | du -scb --files0-from=- | tail -n 1

ভিতরে যদি কিছু হার্ডলিঙ্কযুক্ত ফাইল থাকে তবে -lবিকল্পটি যুক্ত করুন duএবং আপনি প্রতিটি হার্ডলিঙ্ক পৃথকভাবে গণনা করতে চান (ডিফল্টরূপে duএকাধিক হার্ডলিঙ্কগুলি কেবল একবার গণনা করে)।

du -sbপ্লেইনের সাথে সর্বাধিক গুরুত্বপূর্ণ পার্থক্য হ'ল পুনরাবৃত্তির সাথে বিভিন্ন duআকারের ডিরেক্টরিগুলিও গণনা করা হয়, যা বিভিন্ন ফাইল সিস্টেম দ্বারা আলাদাভাবে প্রতিবেদন করা হয়; এটি এড়াতে findকমান্ডটি কেবলমাত্র নিয়মিত ফাইলগুলিতেই পাস করতে ব্যবহৃত হয় du। আর একটি পার্থক্য হ'ল সিমলিংকগুলি উপেক্ষা করা হয় (যদি তাদের গণনা করা হয় তবে findকমান্ডটি সামঞ্জস্য করা উচিত)।

এই কমান্ডের এছাড়াও প্লেইন তুলনায় আরো মেমরি গ্রাস করবে du -sb, কারণ ব্যবহার --files0-from=FILEতোলে duদোকান ডিভাইস এবং এর inode সংখ্যার সব যেমন একটির বেশি হার্ড লিঙ্ক সহ শুধুমাত্র ফাইল স্মরণ ডিফল্ট ব্যবহারকে উল্টোদিকে, প্রক্রিয়াজাত ফাইল। ( -lবিকল্পটি একাধিকবার হার্ডলিঙ্কগুলি গণনা করার জন্য ব্যবহার করা হয় তবে এটি কোনও সমস্যা নয় কারণ ডিভাইস এবং ইনড নম্বর সংরক্ষণ করার একমাত্র কারণ হ'ল হার্ডলিংকযুক্ত ফাইলগুলি এড়িয়ে যাওয়া যা ইতিমধ্যে প্রক্রিয়াজাত ছিল।)

আপনি যদি মোট আকারের একটি মানব-পঠনযোগ্য উপস্থাপনা পেতে চান তবে কেবলমাত্র -hবিকল্পটি যুক্ত করুন (এটি কাজ করে কারণ duকেবলমাত্র একবার অনুরোধ করা হয়েছে এবং কয়েকটি অন্যান্য প্রস্তাবিত উত্তরের তুলনায় মোট আকারটি নিজেই গণনা করা হয়):

find . -type f -print0 | du -scbh --files0-from=- | tail -n 1

বা (আপনি যদি উদ্বিগ্ন হন যে এর কিছু প্রভাবগুলি -bএর পরে ওভাররাইড হয়ে গেছে -h)

find . -type f -print0 | du -sc --apparent-size -h --files0-from=- | tail -n 1

ফ্রিবিএসডি-র জন্য কী করা উচিত তা নিশ্চিত নন - যদিও -bসম্ভবত এটি প্রতিস্থাপন করা যেতে পারে তবে এর -A -B 1সমতুল্য নেই --files0-from=-এবং xargsফাইল তালিকাটি বড় ARG_MAX(এবং মানব-পঠনযোগ্য আউটপুটটির জন্য কিছু বাহ্যিক সমাধান) এর চেয়ে বড় হয়ে থাকলে কিছু ব্যবহারের প্রয়োজন হবে ।
সের্গেই ভ্লাসভ

3

ডিরেক্টরিগুলি যে স্থান গ্রহণ করে তা বাদ দিয়ে যদি আপনি চান সমস্ত ফাইলের আকার হয় তবে আপনি এর মতো কিছু করতে পারেন

find . -type f -print0 | xargs -0 du -scb | tail -n 1

@ সের্গেভি্লাসভ উল্লেখ করেছেন যে আপনার যদি আরও বেশি ফাইল থাকে তবে এটি ব্যর্থ হবে argmax। এড়াতে আপনি যেমন কিছু ব্যবহার করতে পারেন:

find . -type f -exec du -sb '{}' \; | gawk '{k+=$1}END{print k}'

1
ডিরেক্টরিতে এতগুলি ফাইল রয়েছে যা নির্বাহের () আর্গুমেন্ট আকারের সীমাতে ফিট করে না - এই কমান্ডটি নিঃশব্দে একটি ভুল ফলাফল দেবে - এক্ষেত্রে একাধিকবার আবেদন করা xargsহবে du, এবং প্রতিটি অনুরোধটি কেবল তার অংশের জন্য দুর্দান্ত মোট মুদ্রণ করবে সম্পূর্ণ ফাইল তালিকার, তারপরে tailশেষ অংশের মোট আকারটি প্রদর্শিত হবে।
সের্গেই ভ্লাসভ

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