খুঁজে পাওয়ার চেয়ে দ্রুত কিছু আছে কি? | ডিরেক্টরিতে ফাইল গণনা করার জন্য wc -l`?


8

অসাধারণভাবে নয় আমাকে একটি ডিরেক্টরিতে ফাইল সংখ্যা গণনা করতে হবে, কখনও কখনও এটি কয়েক মিলিয়নতে চলে যায়।

কেবলমাত্র গণনা করা এবং সেগুলি গণনা করার চেয়ে আরও ভাল উপায় কি আছে find . | wc -l? আপনি কি ext3 / 4 তে এমন কোনও ফাইল সিস্টেম কল করতে পারেন যা I / O নিবিড় হয়?


3
আপনি কেবল ফাইলগুলিই নয়, ডিরেক্টরিগুলিও গণনা করছেন। আপনি যদি কেবল ফাইলগুলি গণনা করতে চান তবে প্রতীকী লিঙ্কগুলি এবং নিয়মিত ফাইলগুলি গণনা করতে চাইলে "সন্ধান করুন--টাইপ f | wc -l" ব্যবহার করুন, "সন্ধান করুন। -প্রকার- f
-or

একটি ডিরেক্টরি হ'ল এক ধরণের ফাইল, যেমন ডিভাইস, সিমলিংক এবং সকেট। নিয়মিত ফাইলগুলি ফাইলগুলির একটি উপসেট হয়।
টবি স্পিড

1
আপনি যে উদাহরণটি দিয়েছেন তা থেকে বোঝা যায় যে আপনি পুনরাবৃত্ত গণনা চান - যদি না হয় তবে আপনার প্রয়োজন find -maxdepth 1। মনে রাখবেন যে আপনার বর্তমান পদ্ধতির সাথে আপনি কোনও নামরে ডাবল-গণনা করবেন যার মধ্যে একটি নিউলাইন চরিত্র রয়েছে।
টবি স্পিড

উত্তর:


13

একটি মৌলিক গতি-গতি নয় তবে কমপক্ষে কিছু :)

find . -printf \\n | wc -l

আপনার ফাইল ফাইলের তালিকাটি পাস করার দরকার নেই, কেবলমাত্র নতুন লাইনের যথেষ্ট। ডিরেক্টরিগুলি যখন র‌্যামে ক্যাশে হয় তখন আমার উবুন্টু 12.04.3 এ এই রূপটি প্রায় 15% দ্রুত। এছাড়াও এই রূপটি নতুন লাইনে থাকা ফাইলের নামগুলি সহ সঠিকভাবে কাজ করবে।

মজার বিষয় হল এই রূপটি উপরেরটির চেয়ে কিছুটা ধীর বলে মনে হচ্ছে:

find . -printf x | wc -c

বিশেষ ক্ষেত্রে - তবে সত্যিই দ্রুত

ডিরেক্টরিটি যদি নিজের ফাইল সিস্টেমে থাকে তবে আপনি কেবল ইনোডগুলি গণনা করতে পারেন:

df -i .

গণ্যমানের চেয়ে অন্য ডিরেক্টরিতে ডিরেক্টরি এবং ফাইলের সংখ্যা যদি খুব বেশি না পরিবর্তন হয় তবে আপনি কেবল বর্তমান df -iফলাফল থেকে এই জ্ঞাত নম্বরটি বিয়োগ করতে পারবেন । এইভাবে আপনি ফাইল এবং ডিরেক্টরিগুলি খুব দ্রুত গণনা করতে সক্ষম হবেন।


"এই রূপটি প্রায় 15% দ্রুত ..." আমাকে অবাক করে তোলে যে আপনি যদি এই সময়ে সময় ব্যবহার করছেন এমন কোনও সহজ কৌশল আছে?
ব্রায়ান জেড

4
@ ব্রায়ানজেড: সময় সহ কমান্ডটি প্রিন্ট করে আপনি একটি কমান্ড সময় করতে পারেন। time find /usr/src/ -printf \\n | wc -l, আপনি ক্যাশে রান মধ্যে দিয়ে পরিষ্কার করতে পারেনsudo sync && sudo sysctl -w vm.drop_caches=3
MattPark

সুতরাং আমি ক্যাশে ছাড়াই প্রথম 2 টি বিকল্পের সাথে গতিতে ধারাবাহিক 2% বৃদ্ধি পেয়েছি। হ্যাঁ এটি করার একটি দুর্দান্ত উপায়। আপনার পরিবেশ যদি এর জন্য সেটআপ হয় তবে অবশ্যই ইনোডগুলি গণনা করা সেরা। আমি এটি বিবেচনা করা হয়নি।
ম্যাটপার্ক

হয় -printf xহিসাবে একই হতে বোঝানো -printf '\0'? ডক্সে এটি উল্লেখ করা দেখছি না।
সিএমসিডিগ্রাগনকাই

@ সিএমসিডিগ্রাগনকাই: এই ক্রিয়াটি সিতে ফাংশনের সাথে -printfএকইভাবে কাজ করে printf()যে মূল পার্থক্যটির সাথে %নির্দেশকের আলাদা অর্থ রয়েছে। পাওয়া প্রতিটি ফাইলের জন্য অ্যাকশনটি চাওয়া হয়েছে। এর অর্থ এটি খুঁজে পাওয়া প্রতিটি ফাইলের জন্য -printf xঅক্ষর মুদ্রণ করবে x(এটি চেষ্টা করুন!) এবং -printf '\0'পাওয়া প্রতিটি ফাইলের জন্য NULL (ASCII কোড 0) অক্ষর মুদ্রণ করবে। -printf '\0'এর কোন বিশেষ অর্থ নেই। উভয়ই wc -cএই উত্তরের সাথে উদাহরণে একই কাজ করবে ।
পাবউক

3

ঠিক সেই উদ্দেশ্যেই আমি এফএফসিএনটি লিখেছি । এটি ডিরেক্টরিগুলির শারীরিক fiemapঅফসেটকে আইওটিটিএল দিয়ে পুনরুদ্ধার করে এবং তারপরে এলোমেলো অ্যাক্সেস হ্রাস করার জন্য একাধিক অনুক্রমিক পাসগুলিতে ডিরেক্টরিটিকে ট্র্যাভারসাল নির্ধারণ করে। আপনি আসলে তুলনায় একটি গতিসম্পন্ন পাবেন কিনা find | wc তা বিভিন্ন কারণের উপর নির্ভর করে:

  • ফাইল সিস্টেমের ধরণ: ফাইল সিস্টেম যেমন ext4 যা fiemapioctl সমর্থন করে সর্বাধিক উপকৃত হবে
  • এলোমেলো অ্যাক্সেসের গতি: এইচডিডিএস এসএসডি থেকে অনেক বেশি উপকৃত হয়
  • ডিরেক্টরি বিন্যাস: নেস্টেড ডিরেক্টরিগুলির সংখ্যা তত বেশি, আরও অনুকূলকরণের সম্ভাবনা

(পুনরায়) relatimeবা তার সাথে মাউন্ট করা nodiratimeগতিও উন্নত করতে পারে (সমস্ত পদ্ধতির জন্য) যখন অ্যাক্সেসগুলি অন্যথায় মেটাডেটা আপডেটের কারণ হয়ে থাকে।


এই শেষ বাক্যটি একটি সার্থক টিপ! আমি মনে করি আপনার প্রোগ্রামটির লিঙ্কটি উন্নত হবে যদি আপনি এটি কীভাবে কাজ করে তার একটি সংক্ষিপ্তসার যোগ করেন। লিঙ্কযুক্ত উত্সের ক্ষেত্রে কোনও খারাপ কিছু ঘটলে (আমরা অবশ্যই এই লিঙ্কটি অবশ্যই রাখি), আমরা তাদের মধ্যে সম্পূর্ণ উত্তরগুলি পছন্দ করি।
টবির স্পিড

2

আসলে, আমার সিস্টেমে (আর্চ লিনাক্স) এই আদেশটি

   ls -A | wc -l

উপরের সব চেয়ে দ্রুত:

   $ time find . | wc -l
  1893

   real    0m0.027s
   user    0m0.004s
   sys     0m0.004s
   $ time find . -printf \\n  | wc -l
   1893

   real    0m0.009s
   user    0m0.000s
   sys     0m0.008s
   $ time find . -printf x  | wc -c
   1893

   real    0m0.009s
   user    0m0.000s
   sys     0m0.008s
   $ time ls -A | wc -l
   1892

   real    0m0.007s
   user    0m0.000s
   sys     0m0.004s

আমি মনে করি যদিও /bin/ls: Argument list too longএলএসের সমস্যাটি হ'ল এটি যদি আপনি গ্লোব্বিং ব্যবহার করেন তবে এটি প্রায়শই এমন কিছু ফেরত দেয় তবে এটি আবার অনুসন্ধানের মতো পুনরাবৃত্তভাবে পরিচালনা করতে পারে, তাই সম্ভবত এটি বিবেচনা করার মতো বিষয়, প্রয়োজন না থাকলে অনুসন্ধানটি ব্যবহার করবেন না।
ম্যাটপার্ক

এটি সম্পর্কে মন্তব্য করতে অনেক দেরী (বহু বছর) বলে মনে হচ্ছে, তবে ls -Aবর্তমান ডিরেক্টরিতে কেবল ফাইলগুলি তালিকাভুক্ত করা হবে যখন তর্ক findছাড়াই -maxdepth 1সমস্ত উপ-ডিরেক্টরিতে একটি পুনরাবৃত্ত অনুসন্ধান করবে।
লুসিয়ানো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.