কমান্ড লাইনটি ব্যবহার করে আমি কোনও ডিরেক্টরিতে ফাইলগুলির একটি গণনা পেতে পারি?


193

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



tree . | tailবা tree -a . | tailলুকানো ফাইল / ডায়ারস অন্তর্ভুক্ত treeকরা পুনরাবৃত্ত হয় যদি এটি আপনি চান।
কোডিচান

উত্তর:


239

"ফাইল" এর বিস্তৃত সংজ্ঞা ব্যবহার করা

ls | wc -l

(দ্রষ্টব্য যে এটি লুকানো ফাইলগুলি গণনা করে না এবং ধরে নেওয়া যায় যে ফাইলের নামগুলিতে নতুন লাইনের অক্ষর নেই)

লুকানো ফাইলগুলি অন্তর্ভুক্ত করতে ( .এবং বাদে ..) এবং নতুন লাইন অক্ষরের সমস্যাগুলি এড়ানোর জন্য, আধ্যাত্মিক উপায়টি হ'ল:

find . ! -name . -prune -print | grep -c /

বা পুনরাবৃত্তির সাথে:

find .//. ! -name . -print | grep -c //

23
wcএকটি "ওয়ার্ড কাউন্ট" প্রোগ্রাম। -lসুইচ লাইন গণনা এটা ঘটায়। এই ক্ষেত্রে, এটি থেকে আউটপুটটিতে লাইনগুলি গণনা করা হচ্ছে ls। কোনও প্রদত্ত ডিরেক্টরিতেও ফাইল গণনা পেতে আমাকে এইভাবেই শেখানো হয়েছিল।
স্যান্ডি

20
অনুগ্রহ করে নোট যুক্ত করুন যা আউটপুটটি যদি পাইপ lsহয় ls -1তবে তা করে ।
লেসমানা

6
এটি কোনও ডিরেক্টরিতে সমস্ত কিছুই পায় না - আপনি ডট ফাইলগুলি মিস করেছেন এবং কয়েকটি অতিরিক্ত লাইনও সংগ্রহ করেছেন। একটি খালি ডিরেক্টরিটি এখনও 1 লাইন ফিরে আসবে। এবং যদি আপনি কল করেন তবে আপনি ls -laডিরেক্টরিতে তিনটি লাইন পাবেন। যদি আপনি চান ls -lA | wc -lএড়িয়ে যেতে .এবং ..এন্ট্রি। তবে আপনি এখনও একের পর এক থাকবেন।

1
একটি খালি ডিরেক্টরি আমার জন্য 0
জেমস রথ

2
একটি সংশোধন করা পদ্ধতি, যা নামের সাথে নতুন লাইনের সাথে ফাইলগুলি দ্বিগুণ করবে না, এটি হ'ল: ls -q | wc -lযদিও নোট করুন যে লুকানো ফাইলগুলি এখনও এই পদ্ধতির দ্বারা গণনা করা হবে না এবং ডিরেক্টরিগুলি গণনা করা হবে।
গডলিজিক

30

ফাইলের সংকীর্ণ সংজ্ঞার জন্য:

 find . -maxdepth 1 -type f | wc -l

এবং আপনি অবশ্যই -maxdepth 1ফাইলগুলি পুনরাবৃত্তভাবে গণনা করার জন্য বাদ দিতে পারেন (বা এটি সর্বাধিক অনুসন্ধানের গভীরতার জন্য সামঞ্জস্য করুন)।
ব্যবহারকারী 7089

1
আপনার কাছে যদি এমন কোনও ফাইল থাকে যার নামটিতে একটি নতুন লাইন থাকে, তবে এই পদ্ধতিটি এটিকে দুটিবার ভুলভাবে গণনা করবে।
গডলিজিক

7
একটি সংশোধন করা পদ্ধতি, যা নামে নতুন find -maxdepth 1 -type f -printf "\n" | wc -l
লাইনের

+1 লুকানো ফাইলগুলির জন্য অনুমতি দিন এবং ডিরেক্টরিগুলি উপেক্ষা করুন
মাইকেল ডুরান্ট

13
ls -1 | wc -l

...

$ ls --help | grep -- '  -1'
    -1                         list one file per line

...

$ wc --help | grep -- '  -l'
    -l, --lines            print the newline counts

PS: নোট ls - <সংখ্যা: এক> | wc - <letter-l>


10
অধিকাংশই সংস্করণ lsনা -1যখন আউটপুট একটি নল হয় স্বয়ংক্রিয়ভাবে।
ডেনিস উইলিয়ামসন

3
@ ডেনিস যে আকর্ষণীয় তা আমি জানতাম না যে কোনও অ্যাপ্লিকেশন বলতে পারে যে তার ফলাফলটি পাইপে যাচ্ছে।
xenoterracide

1
আমি এই সংস্করণটি এড করেছি কারণ এটি আরও স্পষ্ট। যদিও, হ্যাঁ ls এটি পাইপযুক্ত করে -1 ব্যবহার করে (এটি চেষ্টা করুন: ls | বিড়াল), আমি -1 বাক্য গঠনটি আরও স্পষ্ট দেখতে পাচ্ছি।
গ্যাবে

3
@ এক্সেনোটেরাকাইড: ব্যাশে:[[ -p /dev/stdin ]] && echo "stdin is from a pipe"
ডেনিস উইলিয়ামসন

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

10

সম্ভবত ls/ wcজুড়ি ব্যবহারের সবচেয়ে সম্পূর্ণ উত্তর

ls -Aq | wc -l

আপনি যদি ডট ফাইলগুলি গণনা করতে চান এবং

ls -q | wc -l

অন্যথায়।

  • -Aডট ফাইল গণনা করা, কিন্তু বাদ .এবং ..
  • -qকরতে lsসঙ্গে nongraphic অক্ষর, বিশেষভাবে newline অক্ষর, প্রতিস্থাপন ?, প্রতিটি ফাইলের জন্য আউটপুট 1 টি লাইন উপার্জন

lsটার্মিনাল থেকে এক-লাইন আউটপুট পেতে (অর্থাত্ এটিতে পাইপ না দিয়ে wc) -1বিকল্প যুক্ত করতে হবে।

( lsকোর্টিল ৮.২৩ এর সাথে পরীক্ষিত আচরণ )


2
যেমন আপনি বলেছেন, -1প্রয়োজন হয় না। হিসাবে "এটা বুদ্ধিমানের কনসোল আউটপুট ফাইলের নামের মধ্যে নতুন লাইন পরিচালনা" , এই কারণ -qসুইচ (যে আপনি পরিবর্তে ব্যবহার করা উচিত -bযা করা হয়েছে কারণ এটি পোর্টেবল) "ফোর্সেস মুদ্রণযোগ্য নয় এমন ফাইলের নাম অক্ষর এবং <ট্যাব> অক্ষর প্রতিটি নিদর্শনের লেখার প্রয়োজন হবে হিসাবে <<tion-mark> ('?') চরিত্র হিসাবে। যদি আউটপুটটি টার্মিনাল ডিভাইসে থাকে তবে প্রয়োগগুলি ডিফল্টরূপে এই বিকল্পটি সরবরাহ করতে পারে "" সুতরাং যেমন ls -Aq | wc -lসমস্ত ফাইল / ডায়ার ls -qp | grep -c /গণনা করা বা কেবল
গোপনীয় ডায়ার

আপনার ইনপুট জন্য ধন্যবাদ। পরিবর্তিত -bহয়েছে -q
ফ্রেস

7

আপনি যদি জানেন তবে বর্তমান ডিরেক্টরিটিতে কমপক্ষে একটি অ গোপন ফাইল রয়েছে:

set -- *; echo "$#"

এটি স্পষ্টতই যে কোনও গ্লোবকে সাধারণীকরণযোগ্য।

কোনও স্ক্রিপ্টে, এর অবস্থানগত পরামিতিগুলিকে ওভাররাইট করার ক্ষেত্রে কখনও কখনও দুর্ভাগ্যজনক পার্শ্ব প্রতিক্রিয়া থাকে। আপনি একটি সাব-শেল ব্যবহার করে বা কোনও ফাংশন (বোর্ন / পোসিক্স সংস্করণ) এর মাধ্যমে এটিকে ঘিরে কাজ করতে পারেন:

count_words () {
  eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"

এর বিকল্প সমাধান হ'ল $(ls -d -- * | wc -l)। গ্লোবটি থাকলে *, কমান্ডটি ছোট করা যেতে পারে $(ls | wc -l)। আউটপুট lsসর্বদা পার্স করা আমাকে অস্বস্তি করে তোলে, তবে আপনার ফাইলের নামগুলিতে যতক্ষণ না নিউলাইন থাকে না বা আপনার lsএড়িয়ে যায় ততক্ষণ এটি কাজ করা উচিত । এবং $(ls -d -- * 2>/dev/null | wc -l)কোনও মেলে না এমন গ্লোবের কেসটি কৌতূহলীভাবে পরিচালনা করার সুবিধা রয়েছে (যেমন, এটি সেই ক্ষেত্রে 0 প্রত্যাবর্তন করে, অন্যদিকে set *গ্লোবটি খালি থাকলে পদ্ধতিটি স্বতঃস্ফূর্তভাবে পরীক্ষা করা প্রয়োজন)।

যদি ফাইলের নামগুলিতে নিউলাইন অক্ষর থাকতে পারে তবে একটি বিকল্প ব্যবহার করা হবে $(ls -d ./* | grep -c /)

প্রচুর ম্যাচিং ফাইল থাকলে একটি গ্লোব সম্প্রসারণের উপর নির্ভর করে এমন কোনও সমাধান যুক্তি তালিকারls সাথে লম্বা ত্রুটি হতে ব্যর্থ হতে পারে ।


1
আপনি কি সত্যিই 13,923 অবস্থানগত পরামিতি তৈরি করতে চান? এবং আপনার আপনার স্থানীয় পরিবর্তনশীল করা localবা এটিকে অপসারণ করা উচিত: eval $1=$#বা কেবল ব্যবহার করুন echo $#এবং করুন number_of_files=$(count_words *)
ডেনিস উইলিয়ামসন

1
@ ডেনিস: মূল বিষয়টির অংশটি ছিল কাঁটাচামচ করা এড়ানো to আমার ধারণা এটি একবিংশ শতাব্দীর উদ্বেগ নয়। ঠিক আছে, আমি স্বীকার করি যে আমি আর পসিক্স শেলগুলি সম্পর্কে আর চিন্তা করি না, তাই আমি অস্থায়ী পরিবর্তনশীল এড়াতে পারতাম।
গিলস

কেন আপনি একটি থেকে বিয়োগ করেছেন $#(আপনি সম্পাদনার আগে এটি করেননি)?
ডেনিস উইলিয়ামসন

@ ডেনিস: আমি এখনও একটি কাঁটাচাটি এড়ানো হচ্ছে (ভাল, এটি রাউটারের মতো ধীর সিপিইউযুক্ত মেশিনগুলিতে কোনও পার্থক্য করে) এবং এর মতো একটি পরিবর্তনশীল নাম পাস করে $1। সুতরাং আমি যা গণনা করতে চাই তা হ'ল প্রথম পরামিতি নয় এমন পরামিতিগুলির সংখ্যা। (আমি ব্যবহার করতে পারছি না shiftকারণ আমার পরিবর্তনশীল নামটি প্রায় রাখার প্রয়োজন)) (উম্মে, এখন আপনি যদি প্রথম লাইনের বিষয়ে জিজ্ঞাসা করতেন ...)
গিলস

@ ডেনিস: এটি ভাবতে আসুন, shiftআমি সঠিকভাবে সময় দিলে আমি এটি ব্যবহার করতে পারি।
গিলস

7

আমি du --inodesদরকারী খুঁজে পেয়েছি , তবে duএটির কোন সংস্করণের প্রয়োজন তা আমি নিশ্চিত নই । এটি ব্যবহার করে findএবং বিকল্প বিকল্পের চেয়ে যথেষ্ট গতিযুক্ত হওয়া উচিত wc

উবুন্টু 17.10 এ, নিম্নলিখিত কাজ করে:

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

সংযুক্ত ইনোডের | sort -nrসংখ্যা অনুসারে অবতরণকে সাজানোর সাথে একত্রিত করুন ।



4

ট্রি কমান্ড ইনস্টল করার পরে, কেবল টাইপ করুন:

tree

আপনি যদি লুকানো ফাইলগুলিও চান:

tree -a

আপনি যদি ডেবিয়ান / মিন্ট / উবুন্টু লিনাক্স ব্যবহার করছেন তবে ট্রি কমান্ডটি ইনস্টল করতে নিম্নলিখিত কমান্ডটি টাইপ করুন:

sudo apt-get install tree

ডিরেক্টরি গাছের সর্বোচ্চ প্রদর্শন স্তর নির্দিষ্ট করার জন্য বিকল্পটি -L ব্যবহার করা হয়। ট্রি কমান্ড কেবল আপনার পছন্দ মতো ডিরেক্টরি ট্রি হিসাবে বিবেচনা করে কেবল ফাইলের সংখ্যাকেই নয়, ডিরেক্টরিগুলির সংখ্যাও গণনা করে।


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

2
find -maxdepth 1 -type f -printf . | wc -c
  • -maxdepth 1এটি অ-পুনরাবৃত্তিমূলক করে তুলবে, findডিফল্টরূপে পুনরাবৃত্ত হয়
  • -type f শুধুমাত্র ফাইল অন্তর্ভুক্ত করা হবে
  • -printf .একটি সুন্দর স্পর্শ। এটি ফাইলের পরিবর্তে প্রতিটি ফাইলের জন্য একটি ডট প্রিন্ট করে এবং এখন এটি কোনও ফাইলের নাম পরিচালনা করতে সক্ষম এবং ডেটা সংরক্ষণ করে; আমাদের কেবল বিন্দু গুনতে হবে :)
  • | wc -c অক্ষর গণনা

1

পাইপ নেই, স্ট্রিং কপি নেই, কাঁটাচামচ নেই, কেবল প্লেইন ব্যাশ ওয়ান লাইনার

$ fcount() { local f i=0; for f in *; do let i++; done; echo $i; }; fcount

1
ডিরেক্টরিতে কোনও ফাইল না থাকলে 1 এর মান দেয়। ফাইল, গণনা ফাইল এবং ডিরেক্টরি গণনা করে না।
স্টিভ

1

গিলস পোস্ট করা লাইনের পাশাপাশি এখানে আরও একটি কৌশল রয়েছে :

word_count () { local c=("$@"); echo "${#c[@]}"; }
file_count=$(word_count *)

যা 13,923 টি উপাদান দিয়ে একটি অ্যারে তৈরি করে (যদি এখানে কতগুলি ফাইল থাকে)।


এই cঅ্যারের বিন্দু কি ? word_count() { echo "$#"; }যথেষ্ট হবে। @ গিলস সলিউশনের মূল বিষয় হ'ল কমান্ড সাবস্টিটিউশন (যা ksh93 ব্যতীত শেলগুলিতে কাঁটাচামচ এবং পাইপ জড়িত) ব্যবহার করা এড়ানোর জন্য একটি গণনাকে ফিরিয়ে আনা ভেরিয়েবলে সংরক্ষণ করা।
স্টাফেন চেজেলাস

1
find . -type f -maxdepth 1 |  wc -l 

এটি কেবল বর্তমান ডিরেক্টরিতে ফাইলগুলি তালিকাবদ্ধ করতে পারে।


find . -type fবর্তমান ডিরেক্টরিতে ফাইলগুলি এবং পুনরাবৃত্তভাবে উপ-ডিরেক্টরিতে সন্ধান করবে।
ধাগ

0

এটি চেষ্টা করুন আশা করি এই উত্তরটি আপনাকে সহায়তা করবে

echo $((`ls -l | wc -l` -1 ))


0

আগে দেওয়া কিছু উত্তর উন্নত করা হয়েছে তবে এবার স্পষ্ট করে বলছে।

$ tree -L 1 | tail -n 1 | cut -d " " -f 3

এটা কিছু ব্যবহার মত কমান্ড পছন্দ লক্ষ্য করা যোগ্য এর tailএবং cut। এছাড়াও, নোট করুন যে গাছটি ডিফল্টরূপে উপলভ্য নয়। উপরের কমান্ডটি প্রথমে 1 স্তরের ডিরেক্টরি সম্পর্কে তথ্য ক্যাপচার করে, তারপরে tail -n 1আমাদের লক্ষ্য যেখানে শেষ লাইনটি পান এবং cutতৃতীয় শব্দটি ব্যবহার করে শেষ করুন।

উদাহরণস্বরূপ, এর মধ্যে অবস্থিত /:

/ $ tree -L 1
.
├── 1
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

20 directories, 1 file
/ $ tree -L 1 | tail -n 1
20 directories, 1 file
/ $ tree -L 1 | tail -n 1 | cut -d " " -f 3
1

তারপরে, ডিরেক্টরিগুলির সংখ্যা জিজ্ঞাসা সম্পর্কে কী?


0

লিনাক্স-এ, কমান্ডটি খুব শক্তিশালী করতে এবং ফাইলগুলিতে হ্যান্ডেল করতে পারে যাতে তাদের নামে নতুন লাইন থাকতে পারে, এটি ব্যবহার করুন:

find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c

এটি আমাদেরকে পার্সিং আউটপুট এর অগ্নিপরীক্ষা থেকে বাঁচায় ls


সম্পর্কিত:


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