ডিরেক্টরিগুলির মাধ্যমে আমি সমস্ত ফাইলকে কীভাবে পুনরাবৃত্তভাবে গণনা করব?


47

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

du -sh /*

যা আমাকে ডিরেক্টরি থেকে রূটের বাইরে ডিরেক্টরিতে ব্যবহৃত স্থান দেবে, তবে এই ক্ষেত্রে আমি ফাইলগুলির সংখ্যা চাই না, আকারটি চাই।



আমি মনে করি যে "সেখানে উপ-ডিরেক্টরিগুলিতে কতগুলি ফাইল সাব-ডিরেক্টরিতে রয়েছে" এটি একটি বিভ্রান্তিকর নির্মাণ। আপনি কী চান তা যদি আরও পরিষ্কারভাবে জানায় তবে আপনি একটি উত্তর পেতে পারেন যা বিলের সাথে খাপ খায়।
স্টিভেন ডি

@ স্টিভেন এটি নতুন করে লিখতে নির্দ্বিধায় ... আমি ভেবেছিলাম আমার উদাহরণটি du -sh /*এটি পরিষ্কার করে দিয়েছে যে আমি কীভাবে গণনাটি কাজ করতে চাই। একই জিনিস, কেবল ফাইলগুলি বাইট না গণনা করুন।
xenoterracide

আপনি ইনোড ব্যবহারের কথা উল্লেখ করার সাথে সাথে আপনি ফাইলগুলির সংখ্যা বা ব্যবহৃত ইনোডের সংখ্যা গণনা করতে চান তা আমি বুঝতে পারি না। ফাইল সিস্টেমে হার্ড লিঙ্ক উপস্থিত থাকলে দুটি আলাদা হয়। বেশিরভাগ, সমস্ত না থাকলে উত্তরগুলি ফাইলের সংখ্যা দেয়। এগুলি অ্যাপল টাইম মেশিন ব্যাকআপ ডিস্কে ব্যবহার করবেন না।
mouviciel

@ মউভিচিল এটি ব্যাকআপ ডিস্কে ব্যবহৃত হচ্ছে না, এবং হ্যাঁ আমি মনে করি এগুলি আলাদা হতে পারে তবে আমি যে পরিবেশে আছি সেখানে খুব কম হার্ডলিঙ্ক রয়েছে, প্রযুক্তিগতভাবে আমার এটির জন্য অনুভূতি অর্জন করা দরকার। কেউ ইনড কোটায় কোথায় জ্বলছে তা বের করুন।
xenoterracide

উত্তর:


60
find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done

সুরক্ষা / সামঞ্জস্যতা স্থির করার জন্য গিলস এবং জেনোটেরাকাসাইডকে ধন্যবাদ

প্রথম অংশ: find -maxdepth 1 -type dবর্তমান কার্যনির্বাহী ডিরেক্টরিতে সমস্ত ডিরেক্টরিগুলির একটি তালিকা ফেরত দেবে। এটি পাইপ করা হয়েছে ...

দ্বিতীয় অংশটি while read -r dir; doকিছুক্ষণের জন্য লুপ শুরু করে - যতক্ষণ না পাইপটি যখন আসবে তখন খোলা থাকে (যা ডিরেক্টরিগুলির সম্পূর্ণ তালিকা প্রেরণ না হওয়া অবধি), পঠন কমান্ড পরের লাইনটি ভেরিয়েবল "দির" এ স্থাপন করবে। তারপরে এটি অবিরত ...

তৃতীয় অংশ: printf "%s:\t" "$dir";"$ dir" (যা ডিরেক্টরিগুলির একটির নাম ধারণ করে) এর পরে একটি ট্যাব অনুসরণ করবে the

চতুর্থ অংশ: find "$dir -f file""ir dir" এ থাকা ডিরেক্টরি নামের ভিতরে থাকা সমস্ত ফাইলের একটি তালিকা তৈরি করে। এই তালিকা পাঠানো হয় ..

পঞ্চম অংশ: wc -l;এর স্ট্যান্ডার্ড ইনপুটটিতে প্রেরিত লাইনের সংখ্যা গণনা করে।

চূড়ান্ত অংশ: doneকেবল লুপ শেষ হয়।

সুতরাং আমরা বর্তমান ডিরেক্টরিতে সমস্ত ডিরেক্টরি একটি তালিকা পেতে। এই ডিরেক্টরিগুলির প্রত্যেকটির জন্য, আমরা এতে থাকা সমস্ত ফাইলের একটি তালিকা তৈরি করি যাতে আমরা সেগুলি ব্যবহার করে সমস্ত গণনা করতে পারি wc -l। ফলাফলটি দেখতে পাবেন:

./dir1: 234
./dir2: 11
./dir3: 2199
...

সর্বদা read -rপ্লেইন readট্রিট ব্যাকস্ল্যাশ বিশেষ হিসাবে ব্যবহার করুন । তারপরে echo -en "$dir:\t"আবার ম্যাঙ্গেল ব্যাকস্ল্যাশ করবে; একটি সহজ ফিক্স printf '%s:\t' "$dir"পরিবর্তে ব্যবহার করা হয়। এর পরে, $dirহওয়া উচিত "$dir"( সর্বদা পরিবর্তনশীল বিকল্পের দ্বিগুণ উদ্ধৃতি ব্যবহার করুন )।
গিলস 'অশুভ হওয়া বন্ধ করুন'

@ গিলস পরামর্শ অনুসারে পরিবর্তিতfind -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" | wc -l; done
xenoterracide

2
আমি sort -n -r -k2এর শেষে যুক্ত করছি , প্রচুর ডিরেক্টরিতে, যাতে আমি জানতে পারি সর্বাধিক ব্যবহার কোথায়
xenoterracide

চতুর্থ অংশ: "ir dir" সন্ধান করে "$ dir" এ থাকা ডিরেক্টরি নামের ভিতরে থাকা সমস্ত ফাইলের একটি তালিকা তৈরি করে। আপনি -type fএটি ফাইল তালিকা তৈরি করতে যোগ করতে ভুলে গেছেন :find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
Krzysztof Boduch

@ ক্রিজিসিক-বডুচ ধন্যবাদ! আমি উত্তর আপডেট।
শন জে গফ

15

চেষ্টা করুন find . -type f | wc -l, এটি বর্তমান ডিরেক্টরিতে থাকা সমস্ত ফাইলের পাশাপাশি সাব ডিরেক্টরিতে সমস্ত ফাইল গণনা করবে। মনে রাখবেন যে সমস্ত ডিরেক্টরি ফাইল হিসাবে গণনা করা হবে না, কেবল সাধারণ ফাইলগুলি।


13

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

ফাইল গণনা সহ ফোল্ডারগুলি তালিকাভুক্ত করুন:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); printf "%4d : %s\n" $n "$dir"; done

নন-শূন্য ফাইল গণনা সহ ফোল্ডারগুলির তালিকা করুন:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

সাব-ফোল্ডার গণনা সহ ফোল্ডারগুলি তালিকাভুক্ত করুন:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; printf "%4d : %s\n" $n "$dir"; done

নন-শূন্য সাব-ফোল্ডার গণনা সহ ফোল্ডারগুলির তালিকা করুন:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

খালি ফোল্ডারগুলি তালিকাবদ্ধ করুন:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -eq 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

সামগ্রী গণনা সহ খালি খালি ফোল্ডারগুলির তালিকা করুন:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

এবং বিটিডব্লিউ .. আপনি যদি আইটেমের গণনা অনুসারে এই তালিকাভুক্ত কমান্ডগুলির যে কোনও একটির আউটপুট পেতে চান .. কমান্ডটি সাজান: "a-list-আদেশ" | সাজান-এন
ডলফিনড্রিম

12

চেষ্টা করুন:

find /path/to/start/at -type f -print | wc -l

একটি সূচনা পয়েন্ট হিসাবে, বা আপনি যদি সত্যিই কেবল কোনও ডিরেক্টরিের সাব-ডিরেক্টরিতে পুনরাবৃত্তি করতে চান (এবং শীর্ষ স্তরের ডিরেক্টরিতে ফাইলগুলি এড়িয়ে যান)

find `find /path/to/start/at -mindepth 1 -maxdepth 1 -type d -print` -type f -print | wc -l

কিছু জন্য +1 | wc -l ... শব্দের গণনাটি এমন একটি দুর্দান্ত ছোট সরঞ্জাম
জোহান

হ্যাঁ তবে এটি কেবল 1 ডিরেক্টরি করে .... আমি একটি ডিরেক্টরিতে সমস্ত ডিরেক্টরিের জন্য গণনা পেতে চাই এবং আমি প্রতিবারই এটি আলাদাভাবে চালাতে চাই না ... অবশ্যই আমি মনে করি আমি একটি লুপ ব্যবহার করতে পারতাম ... তবে আমি অলস হয়ে যাচ্ছি
xenoterracide

findডিফল্টরূপে সমস্ত উপ ডিরেক্টরি মাধ্যমে পুনরাবৃত্তভাবে কাজ করে। আপনি যদি এটি একাধিক স্থানে কাজ করতে চান তবে আপনি তাদের মধ্যে findএবং এর মধ্যে সমস্ত নির্দিষ্ট করতে পারেন -type
দিদিয়ের ট্রসেট

দ্বিতীয়টি অবশ্যই কাজ করে না .... আমি চেষ্টা করেছি / বাড়িতে। আমি পেয়েছি 698035 । আমার প্রায় 6 নম্বর দেখতে হবে।
xenoterracide

এটি আমার পক্ষে কাজ করে - আপনি কি কেবলমাত্র 6 টি ফাইলের নিচে আছেন তা নিশ্চিত /home? আমি নিশ্চিত 100% আপনি না।
কান্না হাভোক

4

নিম্নলিখিত সমাধানটি বর্তমান ডিরেক্টরি থেকে শুরু হওয়া ব্যবহৃত ইনডগুলির প্রকৃত সংখ্যা গণনা করে:

find . -print0 | xargs -0 -n 1 ls -id | cut -d' ' -f1 | sort -u | wc -l

একই সাবসেটের ফাইলগুলির সংখ্যা পেতে, ব্যবহার করুন:

find . | wc -l

বর্তমান ডিরেক্টরিতে অ্যাকাউন্ট ফাইল গ্রহণ না করে কেবলমাত্র উপ-ডিরেক্টরিগুলি অন্বেষণের সমাধানগুলির জন্য, আপনি অন্যান্য উত্তরগুলি উল্লেখ করতে পারেন।


1
হার্ড লিঙ্কগুলি অ্যাকাউন্টে নেওয়া ভাল ধারণা। গনুহ খোঁজ ধরে নেওয়া যাক, তাই আপনাকে অনেক পদক্ষেপ প্রয়োজন হবে না: find -printf '%i\n' | sort -u | wc -l। আপনি যদি পোর্টেবল হতে চান তবে তার find . -exec ls -id {} + | cut …পরিবর্তে আপনার প্রয়োজন হবে।
গিলস 'দুষ্ট হওয়া বন্ধ করুন'

2

ওএস এক্স 10.6 স্বীকৃত উত্তরে কমান্ডটি দমন করে, কারণ এটির জন্য কোনও পথ নির্দিষ্ট করে না find। পরিবর্তে ব্যবহার করুন:

find . -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done

2

আমি জানি আমি পার্টিতে দেরি করেছি, তবে আমি বিশ্বাস করি যে এই বিশুদ্ধ bash(বা অন্যান্য শেল যা ডাবল স্টার গ্লোব গ্রহণ করে) সমাধান কিছু পরিস্থিতিতে খুব দ্রুত হতে পারে:

shopt -s globstar    # to enable ** glob in bash
for dir in */; do a=( "$dir"/**/* ); printf "%s\t%s\n" "$dir:" "${#a[*]}"; done

আউটপুট:

d1/:    302
d2/:    24
d3/:    640
...

1

একবার চেষ্টা করে দেখুন:

find -type d -print0 | xargs -0 -I {} sh -c 'printf "%s\t%s\n" "$(find "{}" -maxdepth 1 -type f | wc -l)" "{}"'

ফাইলনামগুলিতে নিউলাইনগুলি অন্তর্ভুক্ত না করা ভাল এটি কাজ করা উচিত।


উপায় খুব পুনরাবৃত্তিমূলক ... আমি কেবলমাত্র শীর্ষ স্তরটি দেখতে চাই, যেখানে এটির নীচে সমস্ত কিছু রয়েছে। মোট ... এটি প্রতিটি ডিরেক্টরি মুদ্রণ শেষ।
xenoterracide

@ এক্সেনোটেরাকাইড: প্রথমটির সাথে -maxdepth 1সাথে যুক্ত করার চেষ্টা করুন find। আপনি যদি আপনার গণনায় উপ-ডিরেক্টরিগুলির সংখ্যা অন্তর্ভুক্ত করতে চান তবে শেষটি সরিয়ে ফেলুন -type f(এটি সত্যিই হওয়া উচিত ! -type dছিল, যাতে সমস্ত নন-ডিরেক্টরি ফাইল অন্তর্ভুক্ত করা হত)।
ডেনিস উইলিয়ামসন

1

আপনার যদি ncduইনস্টল থাকে (কিছু ক্লিনআপ করতে চাইলে অবশ্যই থাকতে হবে), কেবল c"চাইল্ড আইটেম গণনা টগল প্রদর্শন" টাইপ করুন। এবং C"আইটেম অনুসারে বাছাই করুন"।


1
হ্যাঁ, এটি অবশ্যই সর্বাধিক স্বীকৃত উত্তর হতে হবে :)
x-yuri

0

du --inodes

আমি নিশ্চিত না যে কেন কেউ (আমার অন্তর্ভুক্ত) সে সম্পর্কে সচেতন ছিল না:

du --inodes
--inodes
      list inode usage information instead of block usage

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

আরও তথ্য

আপনি যদি পুনরাবৃত্তি করতে চান না (যা অন্যান্য পরিস্থিতিতে কার্যকর হতে পারে), যোগ করুন

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