অন্য যে কোনও জায়গায় হার্ডলিঙ্কযুক্ত নয় কেবলমাত্র ফাইলগুলি কীভাবে স্থান ব্যবহার করবে?


14

rsync --link-destস্পেস-সেভিং স্ন্যাপশটগুলির জন্য ব্যবহার করে , আমি কীভাবে প্রকৃতপক্ষে আমি কতটা স্থান সঞ্চয় করেছি তা অনুধাবন করতে পারি? বা আরও সাধারণ:

ডিরেক্টরি কাঠামোর বাইরে অন্য কোথাও হার্ডলিঙ্কযুক্ত নয় এমন ফাইলগুলি বিবেচনা করে একটি ডিরেক্টরি কতটা স্থান ব্যবহার করে তা কীভাবে নির্ধারণ করা যায় ? অন্যরকম জিজ্ঞাসা করা হয়েছিল: ডিরেক্টরিটি মুছে ফেলার পরে প্রকৃতপক্ষে কতটা জায়গা মুক্ত করা হবে? ( du -hsমিথ্যা বলবে। কট্টর লিঙ্কগুলির জন্য প্রয়োজনীয় স্থানটি তাদের অন্তর্ভুক্ত থাকতে পারে)


2
ডিফল্টরূপে, জিএনইউ duকেবলমাত্র ফাইলের মাপগুলি গণনা করে যদি আপনি -l/ --count-linksঅপশনটি ব্যবহার না করেন তবে সেগুলি শক্ত লিঙ্কযুক্ত রয়েছে । আপনি duপুরো ট্রিটিতে দু'বার দৌড়ান , সেই বিকল্পটি ছাড়া এবং সেগুলি ছাড়াই এবং মাপের মধ্যে পার্থক্যটি হওয়া উচিত যে আপনি সমস্ত ডিরেক্টরিতে কতটা স্থান সঞ্চয় করেছেন।
jw013

1
আরও দেখুন stackoverflow.com/questions/19951883/...
Rmano

উত্তর:


9

ধরে নিই যে অভ্যন্তরীণ হার্ডলিঙ্কগুলি নেই (অর্থাত 1 টিরও বেশি হার্ডলিঙ্কযুক্ত প্রতিটি ফাইল গাছের বাইরে থেকে সংযুক্ত), আপনি এটি করতে পারেন:

find . -links -2 -print0 | du -c --files0-from=-

সম্পাদনা করুন এবং এখানে আমি মন্তব্যটিতে স্কেচ করেছি, প্রয়োগ করেছি। কেবল ছাড়া du; লক্ষ্য করার জন্য @ স্টেফেন চ্যাজেলাস থেকে কুদোস duপ্রয়োজনীয় নয়। শেষে ব্যাখ্যা।

( find . -type d -printf '%k + ' ; \
  find . \! -type d -printf '%n\t%i\t%k\n' | \
    sort | uniq -c                         | \
    awk '$1 >= $2 { print $4 " +\\" }' ; \
  echo 0 ) | bc

আমরা যা করি তা হ'ল প্রতিটি প্রাসঙ্গিক ফাইলের ডিস্কের ব্যবহার (কেবিতে) দিয়ে প্লাস চিহ্ন দ্বারা আলাদা করে স্ট্রিং তৈরি করা। তারপরে আমরা সেই বড় সংযোজনটি ফিড করি bc

প্রথম findঅনুরোধটি ডিরেক্টরিগুলির জন্য এটি করে।

দ্বিতীয় findমুদ্রণ লিঙ্ক গণনা, ইনোড এবং ডিস্ক ব্যবহার। আমরা sort | uniq -cএকটি তালিকা পেতে গাছটি (গাছের উপস্থিতির সংখ্যা, লিঙ্ক গণনা, ইনোড, ডিস্ক ব্যবহার) এর তালিকাটি পাস করি ।

আমরা সেই তালিকাটি পাস করেছি awkএবং, যদি প্রথম ক্ষেত্রটি (উপস্থিতিগুলির # টি) দ্বিতীয় (# হার্ডলিঙ্কগুলির) এর চেয়ে বড় বা সমান হয়, যার অর্থ গাছের বাইরে থেকে এই ফাইলটির লিঙ্ক নেই, তবে চতুর্থ ক্ষেত্রটি মুদ্রণ করুন ( ডিস্ক ব্যবহার) একটি প্লাস চিহ্ন এবং একটি ব্যাকস্ল্যাশ সংযুক্ত সঙ্গে।

পরিশেষে আমরা একটি আউটপুট পাই 0, সুতরাং সূত্রটি সিন্টেক্সিকভাবে সঠিক (এটি +অন্যথায় প্রবেশ করবে) এবং এটিতে প্রেরণ করব bc। ইসস।

(তবে আমি যদি সহজ যথেষ্ট উত্তর দেয় তবে আমি সহজ প্রথম পদ্ধতিটি ব্যবহার করব))


ধন্যবাদ, হ্যাঁ যদি সেই প্রয়োজনীয়তা পূরণ হয় তবে তা কার্যকর হয়। তবে তা না হলে কী হবে?
টোবিয়াস কেইনজলার

এটি কাজ করে না যেহেতু এটি নিজেরাই ডিরেক্টরিগুলির আকারের জন্য অ্যাকাউন্টে ব্যর্থ হয় (যার সাধারণত কমপক্ষে 2 টি লিঙ্ক থাকে এবং যদি এটি না থাকে তবে আপনার কাছে ফাইলগুলি দুবার গণনা করা হত)।
স্টাফেন চ্যাজেলাস

1
তারপরে findসমস্ত ফাইলের একটি তালিকা তাদের ইনোড এবং লিঙ্ক গণনা সহ মুদ্রণের জন্য ব্যবহার করা প্রয়োজন ; তারপরে sort | uniq -cগাছের মধ্যে প্রতিটি ইনোড কতবার প্রদর্শিত হবে তার কয়েকটি মিশ্রণ , তারপরে সংখ্যার উপস্থিতির চেয়ে লিংক কাউন্টের সাথে ফিল্টার করুন ... এবং তারপরে সেই তালিকাটি ফিড করুন du। তবে প্রয়োজনীয়তাটি যদি পূরণ হয় তবে চেষ্টাটি আরও ভাল করে সংরক্ষণ করুন।
অ্যাঙ্গাস

@ স্টেফেন চ্যাজেলাস এটি কাজ করে তবে এটি সত্য যে এটি ডিরেক্টরিগুলির নিজস্ব আকারের জন্য অ্যাকাউন্ট করে না। যদি শুধুমাত্র duএকটি ছিল -dপ্যারামিটার অনুরূপ lss 'এর ...
অ্যাঙ্গাস

এছাড়াও নোট করুন যে btrfsফাইল সিস্টেমে ডিরেক্টরিগুলির জন্য লিঙ্কের সংখ্যা সর্বদা থাকে 1, সুতরাং আপনাকে একটি যুক্ত করতে হবে! -type d
Stéphane Chazelas

5

মূলত, আপনাকে সমস্ত ফাইলের জন্য ইনোড নম্বর এবং লিঙ্কের সংখ্যা (ডিরেক্টরিবিহীন) পেতে হবে, প্রতিটি আইনের সংযোগের সংখ্যার সাথে সেই সংখ্যার তুলনা করতে হবে, এবং যদি সেগুলি পৃথক হয় তবে ফাইলটি বাদ দিন।

ধরে নিই, তারা সবাই একই ফাইল সিস্টেমে রয়েছে, এর মতো কিছু কাজ করা উচিত (জিএনইউ অনুসন্ধান সহ):

find . -type d -printf '%k\n' -o -printf '%i %n %k\n' |
   awk '
     NF==1{t+=$0; next}
     {n1[$1]=$2; n2[$1]++; s[$1]=$3}
     END {
       for (i in n1)
         if (n1[i] == n2[i])
           t+=s[i]
       print t
     }'

হ্যাঁ, আমি যা বলেছি (কৃতিত্বের জন্য ধন্যবাদ)। ডিরেক্টরিগুলি গণনা করে আপনি যে অতিরিক্ত নির্ভুলতা পাবেন, আপনি নির্ভুল ডিস্কের ব্যবহার যুক্ত করে হারাবেন।
অ্যাঙ্গাস

@ ইঙ্গাস, "অক্ষত ডিস্ক ব্যবহার" বলতে কী বোঝ?
স্টাফেন চেজেলাস

কিছুই না, আমি কি %kরিপোর্ট করা হয়েছে তা সম্পর্কে সম্পূর্ণ ভুল ছিল । এটা দুর্দান্ত, duএকেবারেই দরকার নেই! আমি বাড়ি ফিরে আমার উত্তর আপডেট করব। ধন্যবাদ!
অ্যাঙ্গাস

3

du প্রকৃতপক্ষে মিথ্যা বলবে না;) এটি দিরকে বিশ্লেষণ করে যেগুলি এটি দেয়, কেবল একই হার্ডলিংকের মধ্যে প্রথমটি গণনা করা হয় যা একই ইনোডের সাথে দেখা হয়।

যদি আপনি duএটি কেবল একটি ডিরেক্টরিতে কী দেখতে পান তা জিজ্ঞাসা করেন, তবে এটি একই বিষয় নয় যে অন্য হার্ড লিঙ্কগুলি এখানে নির্দেশ করছে:

$ du -h daily.0 && du -hc daily.1
29G /daily.0
29G /daily.1

এবার এটিকে একই সারিতে দিন (আরএসএনসি ইনক্রিমেন্টাল ব্যাকআপের সাথে সাম্প্রতিকতমটি দিয়ে শুরু করুন --link-dest):

$ du -hc daily.0 daily.1
29G /daily.0
364M /daily.1
29G total

বা পুরো ব্যাকআপ দির:

$ du -hc --max-depth=1 /snapshots
29G /daily.0
364M /daily.1
537M /daily.2
333M /daily.3
30G total

'ডেইলি .১' এর যে কোনও ফাইলই ইনোড (ওরফে "রিয়েল" ফাইল) রেফারেন্স করে ইতিমধ্যে 'দৈনিক ০.' তে উল্লিখিত রয়েছে।

সুতরাং প্রতিদিন 1 মুছে ফেলা আপনার ডিভাইসে 364MB সাশ্রয় করবে।

অপসারণ

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