নির্দিষ্ট এক্সটেনশান সহ নির্দিষ্ট ডিরেক্টরিতে ফাইলগুলির মোট সংখ্যা গণনা করুন


32

আমি "ডিরেক্টরি। এমপি 4" এক্সটেনশন দিয়ে শেষ হওয়া নির্দিষ্ট ডিরেক্টরিতে ফাইলগুলির মোট সংখ্যা গণনা করতে চাই।

আমি নিম্নলিখিত কমান্ড পাচ্ছি:

ls -F |grep -v / | wc -l

এটি নির্দিষ্ট ডিরেক্টরিতে সমস্ত ফাইল গণনা করে তবে আমি .mp4 এক্সটেনশনের সাথে শেষ হওয়া ফাইলগুলির গণনা চাই।

এর জন্য কি কোনও উবুন্টু আদেশ আছে?


2
সরল, সঠিক, সরল উত্তর হ'ল @ লুইস-মঠিজিজেন একটি। ls -1এই ক্ষেত্রে নতুন লাইন অক্ষরগুলি পরিচালনা করে lsআউটপুট পার্স করার ক্ষেত্রে বোধগম্য । চিহ্নিত করাটি -আর পতাকা ব্যবহারের জন্য ভুল।
রোমানো

উত্তর:


19

এখানে আপনি এইভাবে করতে পারেন

ls -lR /path/to/dir/*.jpg | wc -l

এটি আপনাকে গণনা দেয়


5
কেন -R? statআপনার যখন কেবল ফাইলের নাম প্রয়োজন তখন কেন একটি সম্পূর্ণ করছেন ? কেন হবে না ls -1 *.jpg| wc -l? (ঠিক আছে, যদি এতে নতুন
লাইনের

2
... এবং প্রশ্নটি ছিল "ডিরেক্টরিতে ফাইলগুলির সংখ্যা গণনা করা"। অধিকন্তু, এটি উপ-ডিরেক্টরিগুলির পুনরাবৃত্তভাবে সমস্ত বিষয়বস্তু তালিকাভুক্ত করবে যা নাম .jpg এ শেষ হয় , উপ-ডিরেক্টরিগুলিতে ফাইলগুলি শেষ হয় না .jpg। আপনি কি কখনও এটি পরীক্ষা করেছেন?
রোমানো

1
প্রশ্নটি "একটি নির্দিষ্ট ডিরেক্টরিতে ফাইলগুলি" বলে, যা সূচিত করে যে উপ-ডিরেক্টরি পুনরাবৃত্তিটি চাওয়া হয়নি।
ডেভিড রিচার্বি

1
ডিরেক্টরিতে খুব বেশি ফাইল থাকলে (কারণ *.jpgশেল দ্বারা প্রসারিত হয়, দ্বারা নয় ls) এবং যদি ফাইল থাকে তবে যাদের নাম হাইফেন দিয়ে শুরু হয় This
ডেভিড রিচার্বি

2
@ ডেভিডরিচার্বি এই নামগুলি এড়িয়ে শুরু করে যা দিয়ে শুরু হয় .। তবে এটি আসলে হাইফেনগুলির সাথে নামগুলিতে ঠিক কাজ করে, /path/to/dirখালি স্ট্রিং বা হাইফেন দিয়ে কোনও আপেক্ষিক পথ কখন শুরু হয় except তবে চরিত্রগুলি প্রতিস্থাপন করে বলে আমি আগে ভুল ছিলাম । এটি ঘটে যখন স্ট্ডআউটটি টার্মিনাল হয় তবে এখানে আউটপুটটি একটি পাইপ তাই ফাইলের নাম থেকে সমস্ত অক্ষর প্রেরণ করে । আচরণটি পরিবর্তন করতে এই পতাকাটিকে পতাকা বা পতাকা ছাড়াই ভুল করে দেয় কারণ ফাইলের নামগুলিতে নতুন লাইন থাকতে পারে। l0b0 এর উত্তর এই সমস্যাগুলি থেকে মুক্ত। ls?lswc-q-b
এলিয়াহ

42

দুর্ভাগ্যক্রমে এই সৌম্য সমস্যাটি এমনভাবে সমাধান করা কঠিন যা সমস্ত ফাইলের নাম সমর্থন করে এবং বহনযোগ্য। এটি নিরাপদ (এটি লুকানো ফাইলগুলি, স্পেসগুলি, ড্যাশগুলি এমনকি নিউলাইনগুলি সহ পাথগুলি পরিচালনা করে) এবং পসিক্স সামঞ্জস্যপূর্ণ :

find /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -c

আপনি যদি এটি পুনরাবৃত্তি না করতে চান তবে কেবল যুক্ত করুন -maxdepth 1

আপনার lsআউটপুট পার্স করা উচিত নয় ।

টেস্ট:

$ cd -- "$(mktemp -d)"
$ touch -- -foo.mp4 .bar.mp4 .bat.mp4 'baz.mp4
> ban.mp4'
$ find . -mindepth 1 -type f -name "*.mp4" -exec printf x \; | wc -c
4

গৃহীত উত্তরের সাথে তুলনা করুন :

$ ls -lR ./*.mp4 | wc -l
3

বা অন্যান্য পরামর্শ:

$ find . -name "*.mp4" | wc -l
5
$ ls -1 *.mp4 | wc -l
ls: invalid option -- '.'
Try 'ls --help' for more information.
0
$ find . -name "*.mp4" | wc -c # Answer fixed at a later time
51
$ find . -name "*.mp4" | wc -l
5
$ find . | grep -i ".mp4$" | wc -l
5
$ ls . | grep ".mp4$" | wc -l
3

2
যদিও এই উত্তরটি সঠিক এবং শক্তিশালী, আপনি এর -printf xপরিবর্তে ব্যবহার করতে পারেন -exec printf x \;। যে: find /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -c করার কোন প্রয়োজন নেই -execবহিরাগত printfকমান্ড, যা যদি অনেক ফাইল হবে? খুব ধীর , কারণ findহয়েছে কাঁটাচামচ (2) নিজেই একটি কপি বন্ধ এবং তারপর execve (2) /usr/bin/printf । সাথে -exec printf x \;, এটি প্রতিটি ফাইলের জন্য একবার করতে হবে ।
এলিয়াহ

-printfপসিক্সে সমর্থিত নয়find , যে কারণে আমি এটি ব্যবহার করিনি।
l0b0

1
না হয় -mindepthএবং -maxdepth, যা আপনি ব্যবহার করেছেন।
এলিয়াহ

ভালো কথা, আমি তো আগে উঠিনি!
l0b0

BSD findথাকে -mindepthএবং -maxdepthতবে এতে থাকে না -printfতাই আমি উভয়ের অন্তর্ভুক্তির প্রশংসা করি।
জোসেফ

11

এটি একটিকে এক্সটেনশন অনুসারে সমস্ত ফাইল সন্ধান করে, বাছাই করে এবং তালিকাবদ্ধ করে:

find . -type f | sed 's/.*\.//' | sort | uniq -c

অসাধারণ! আমি ঠিক | sort -rnশেষে একটি যোগ করতে এবং সম্ভবত একটি -mindepth 1যদি স্যার বর্তমান dir।
পাবলো এ

এবং সম্ভবত পাইপ head -nপেতে শীর্ষ এন।
রমন

এত বড় উত্তর, অনেক অনেক ধন্যবাদ
ডেনিস গোলোমাজভ

5

আমি মনে করি এটি নিম্নলিখিত কমান্ড হিসাবে খুব সহজ।

$ find . -name "*.mp4" | wc -l
8

অথবা

$ find . | grep -i ".mp4$" | wc -l
8

আমি মনে করি যে উপরের কমান্ডগুলি ফাইল এবং ডিরেক্টরিগুলির নাম গণনা করে *.mp4

সুতরাং আমি আপনাকে নিম্নলিখিত -type fহিসাবে findপ্যারামিটার হিসাবে বিকল্পটি ব্যবহার করার পরামর্শ দিচ্ছি ।

$ find . -name "*.mp4" -type f | wc -l
8

এছাড়াও, ls -lRহিসাবে ব্যবহার করা যেতে পারেfind .


2

আপনি ব্যবহার করতে পারে ls -1 *.mp4 | wc -l

এটি শেষ হওয়া সমস্ত ফাইলের তালিকা তৈরি করবে .mp4, প্রতিটি ফাইলকে একটি নতুন লাইনে ( ls -1 *.mp4) মুদ্রণ করবে , আউটপুটটি পাইপ wcকরবে যা -lপতাকা ব্যবহার করে নতুন রেখার সংখ্যা গণনা করবে ।


কেন এটিকে নিম্নমান দেওয়া হয়েছিল তা নিশ্চিত নয়, এটি কাজ করে
প্যান্থার

যেহেতু *.mp4শেল দ্বারা প্রসারিত হয়, তা নয় ls, .mp4ডিরেক্টরিতে এতগুলি ফাইল উপস্থিত থাকলে এটির তালিকাটি lsআর্গুমেন্ট হিসাবে প্রেরণ করা যায় না এটি ব্যর্থ হবে ।
ডেভিড রিচার্বি

@ রুমানা এটি ফাইল ডিরেক্টরিযুক্ত একটি ডিরেক্টরিতে পরীক্ষা করুন--.mp4
ডেভিড রিচার্বি

@ ডেভিডরিচার্বি হ্যাঁ, আপনি ঠিক বলেছেন। --দ্বিতীয় কেস সমাধান করবে; প্রাক্তন একটি ত্রুটি বার্তা উত্থাপন করবে (আপনার অনেক ফাইল দরকার!) এবং অন্য একটি সুন্দর প্রশ্ন এখানে। কর্ণারের ক্ষেত্রে, তবে লক্ষ্য করার মতো, হ্যাঁ।
রোমানো

1
@ রুমানো যুক্ত না করে -qবা -b, এটি ফাইলের নামগুলিতে নতুন লাইন সহ্য করে না । আপনি যদি ls -1 *.mp4কোনও পাইপ ছাড়াই আপনার টার্মিনাল থেকে চালনা করেন তবে দেখুন lsএটির স্টাডাউটটি একটি টার্মিনাল এবং প্রবন্ধ -qহিসাবে মুদ্রিত হবে ?s কিন্তু আউটপুটটি পাইপ করা হলে সেই আচরণটি চলে যায়। ls -1 *.mp4 | wc -lনতুন লাইন থাকলে ওভারকাউন্টস। " ls -1 *.mp4 | catকি দেখায় wc" দেখায়। (একইভাবে, -1যখন স্টডআউট টার্মিনাল নয় তখনই বোঝানো হয় ) সুতরাং এটি ls -1q -- *.mp4 | wc -loptionচ্ছিক )) প্রায় কাজ করে তবে শূন্য। এমপি 4 ফাইল দিয়ে নয়।
এলিয়াহ

0

এটি আপনাকে এমপি 4 সহ ফাইলের তালিকা দেয়

ls /path/to/directory | grep ".mp4$"

একত্রিত হলে wc -lআপনাকে গণনা দেবে

ls /path/to/directory | grep ".mp4$" | wc -l

আপনি যদি অনুসন্ধানটি উপ-ডিরেক্টরি অন্তর্ভুক্ত করতে চান

ls -lR /path/to/directory | grep ".mp4$" | wc -l

কোনও গণনা দেয় না
প্যান্থার

এটি ব্যবহার করার সময় আমাকে দিয়েছিলwc -l
ব্যাক.স্ল্যাশ

আপনার উত্তরটি গ্রেপ করতে এবং সংক্ষিপ্ত করতে পাইপ ছাড়াই এলএস ব্যবহার করুন। এটি এখন অন্তত দু'বার পোস্ট করা হয়েছে।
প্যান্থার

@ বোডি.জাজেন ls /directory/*.mp4শেলটি বিশ্বব্যাপী প্রসারিত করে এবং এরকম কিছু কার্যকর করে তোলে কারণ ls /directory/file1.mp4 /directory/file2.mp4 ...যদি ডিরেক্টরিতে আর্গুমেন্ট হিসাবে পাস করার চেয়ে বেশি এমপি 4 ফাইল থাকে তবে এটি ব্যর্থ হবে ls
ডেভিড রিচার্বি

@ ডেভিড রিচার্বি - এটি আমার এলএস আদেশ নয়, আমি সন্ধান করি;)
প্যান্থার


0
ls | grep --count \.csv$

প্রতিস্থাপন (আপনি চান এক্সটেনশনটি দিয়ে .csv)

ব্যাখ্যা: আমি মনে করি যে একটি সাধারণ স্কিম ফাইলগুলির তালিকা আনতে এবং গ্রেপ দিয়ে এক্সটেনশনটি গণনা করে। \.মেলে .এবং $লাইন শেষে এক্সটেনশন মেলে। এটি কাজ করে কারণ যখন ls এর আউটপুটটি পাইপ করা হয়, তখন প্রতি লাইনে একটি ফাইলের নাম পাঠানো হয়, যা আপনি চালিয়ে যাচাই করতে পারবেন:

ls | cat

1
মনে রাখবেন পরিবর্তে grep --count, আপনি এটি ব্যবহার করতে পারেন grep -c
মহসিন রাজা

0

লিনাক্সে এক্সটেনশন করে কীভাবে ফাইলগুলি গণনা করবেন তা পরীক্ষা করে দেখুন ? , এটি একটি ভাল উত্তর এবং ব্যাখ্যা দেয়, আপনি নিম্নলিখিত আদেশটি ব্যবহার করতে পারেন:

find . -type f | sed -n 's/..*\.//p' | sort | uniq -c
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.