এক্সটেনশান দ্বারা ডিরেক্টরিতে ফাইল গণনা করুন


15

পরীক্ষার উদ্দেশ্যে, আমি কোনও ডিরেক্টরিতে কতগুলি চিত্রের ফাইল রয়েছে তা গণনা করতে চাইছি এবং প্রতিটি চিত্রের ফাইলের প্রকারকে ফাইলের এক্সটেনশান দ্বারা পৃথক করে (jpg = "হ্যাঁ"। কারণ এটি পরে অন্য স্ক্রিপ্টের জন্য কার্যকর হবে যা কোনও ক্রিয়া সম্পাদন করবে প্রতিটি ফাইল এক্সটেনশনে)। আমি কি কেবল জেপিইজি ফাইলগুলির জন্য নিম্নলিখিতগুলির মতো কিছু ব্যবহার করতে পারি?

jpg=""
count=`ls -1 *.jpg 2>/dev/null | wc -l`
if [ $count != 0 ]
then
echo jpg files found: $count ; jpg="yes"
fi

ফাইল এক্সটেনশনগুলি jpg, png, bmp, কাঁচা এবং অন্যান্য বিবেচনা করে, আমি whileকি এটি করার জন্য একটি চক্র ব্যবহার করব?

উত্তর:


14

এর সম্ভাব্য শব্দ বিভাজন সম্পর্কিত সমস্যাগুলি এড়িয়ে আমি একটি ভিন্ন পদ্ধতির পরামর্শ দেব ls

#!/bin/bash

shopt -s nullglob

for ext in jpg png gif; do 
  files=( *."$ext" )
  printf 'number of %s files: %d\n' "$ext" "${#files[@]}"

  # now we can loop over all the files having the current extension
  for f in "${files[@]}"; do
    # anything else you like with these files
    :
  done 

done

আপনি filesপ্রতিটি নির্দিষ্ট এক্সটেনশনের ফাইলগুলিতে সম্পাদন করতে চান এমন অন্য কোনও কমান্ডের সাহায্যে অ্যারের উপরে লুপ করতে পারেন।


আরও বহনযোগ্য - বা শেলগুলির জন্য যা স্পষ্টভাবে অ্যারে সরবরাহ করে না - আপনি শেলের অবস্থানগত প্যারামিটার অ্যারে পুনরায় ব্যবহার করতে পারেন ie

set -- *."$ext"

এবং তারপরে ${#files[@]}এবং এর ${files[@]}সাথে $#এবং প্রতিস্থাপন করুন"$@"


23

আমার পদ্ধতির হবে:

  1. ডিরেক্টরিতে সমস্ত ফাইল তালিকাবদ্ধ করুন
  2. তাদের এক্সটেনশন এক্সট্রাক্ট
  3. ফলাফলটি বাছাই করুন
  4. প্রতিটি এক্সটেনশনের ঘটনাগুলি গণনা করুন

এর মতো বাছাই করুন (শেষ awkকলটি নিখুঁত বিন্যাসের জন্য):

ls -q -U | awk -F . '{print $NF}' | sort | uniq -c | awk '{print $2,$1}'

(জেননুকে lsএখানে -Uঅপ্টিমাইজেশন হিসাবে বাছাইয়ের বিকল্পটির জন্য ধরে নিচ্ছেন supported সমর্থিত না হলে কার্যকারিতা প্রভাবিত না করে এটি নিরাপদে অপসারণ করা যেতে পারে)।


mhmh ... পরে কি প্রতিটি এক্সটেনশান এর জন্য কোনও ক্রিয়া করার জন্য আমি ফিল্টার করা উচিত?
watchmansky

এটি শেষ পর্যন্ত আপনি কী করতে চান তার উপর নির্ভর করে। আপনি আরও তথ্য দিতে পারেন?
গ্রাওক্সদা

আমার লক্ষ্য: একটি স্ক্রিপ্ট যা প্রতিটি এক্সটেনশন ফাইল (কেবলমাত্র চিত্র ফাইল) ইনপুট ব্যবহারকারীর ডেটা থেকে আকার পরিবর্তন করে process সুতরাং, আমি এখানে কতগুলি জেপিজি ফাইল, পরের পিএনজি ইত্যাদি থেকে শুরু করছি
ওয়াচম্যানস্কি

স্টিলড্রাইভারগুলির সমাধানটি তখন আরও উপযুক্ত হতে পারে।
গ্রুমিক্সদা

2
আমার JPGএবং jpgফাইল উভয়ই ছিল এবং এটি পুনরাবৃত্তির সাথে চেয়েছিল তাই আমার সমাধানটি লিখতে হয়েছিলfind . -type f | awk -F . '{print tolower($NF)}' | sort | uniq -c | awk '{print $2,":",$1}'
ক্রিশ্চিয়ান

11

এটি পুনরাবৃত্তভাবে ফাইলগুলিকে এবং যেগুলির সাথে মেলে এমন এক্সটেনশানগুলি গণনা করে:

$ find . -type f | sed -e 's/.*\.//' | sort | uniq -c | sort -n | grep -Ei '(tiff|bmp|jpeg|jpg|png|gif)$'
   6 tiff
   7 bmp
  26 jpeg
  38 gif
  51 jpg
  54 png

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

3
দিয়ে একটি সূচনা ডিরেক্টরিটি ভুলে যাবেন না find। এছাড়াও, যদি আপনি আপনার সমাধানটির সংক্ষিপ্ত বিবরণ দেন (তবে তারা যদি কিছুটা আলাদা ক্ষেত্রে এটি পরিবর্তন করতে চান) তবে এই উত্তরগুলির ভবিষ্যতের পাঠকদের সহায়তা করতে পারে।
জেফ শ্যাচলার

এই সমাধানটি ফাঁকা স্থান সহ পথের নামগুলির সাথে কতটা ভাল আচরণ করে? নতুন লাইন?
ধাগ

1
findবর্তমান ডিরেক্টরিটিতে ডিফল্ট, যা আমি এটি ব্যবহার করি। আমি মনে করি না যে fileশ্বর ফাইলের নামগুলি ফাঁকা রাখতে চেয়েছিলেন, তবে এই ক্ষেত্রে এটি ঠিক আছে। আপনার যদি নতুন লাইন থাকে তবে আপনি যা পান তা আপনার প্রাপ্য। আমি একটি ব্যাখ্যা সম্পর্কে ভেবেছিলাম তবে সিদ্ধান্ত নিয়েছি উত্তরটি দীর্ঘায়িত করবে, আমি মনে করি সরলতাটি গুরুত্বপূর্ণ। 99% ক্ষেত্রে 1% সময়। এটি সম্ভবত সংস্করণ 7 সামঞ্জস্যপূর্ণ।
Neik


3

যে কোনও কিছুতে জড়িত থাকার lsফলে বিশেষ চরগুলি (স্থান এবং অন্যান্য চিহ্ন) দিয়ে অপ্রত্যাশিত ফলাফল পাওয়া সম্ভব। কোনও বাশিজম (অ্যারেগুলির মতো) বহনযোগ্য নয়। জড়িত while readযে কোনও কিছু সাধারণত ধীর হয়।

অন্যদিকে, findএটি খুব নমনীয় (ফিল্টার করার জন্য প্রচুর বিকল্প), এতে [কমপক্ষে] দুটি বাক্য গঠন রয়েছে যা বিশেষ অক্ষরের জন্য নিরাপদে ব্যর্থ হয় ... এবং এটি বৃহত ডিরেক্টরিতে ভাল স্কেল করে।

এই উদাহরণস্বরূপ, আমি -inameউপরের এবং নিম্ন উভয় ক্ষেত্রেই এক্সটেনশনের নামের সাথে মিল রেখেছি । -maxdepth 1আপনার প্রশ্নের "বর্তমান ডিরেক্টরিতে" সম্মান করার বিষয়টিও আমি সীমাবদ্ধ করেছি । লাইনের সংখ্যা গণনা করার পরিবর্তে, যেখানে ফাইলের নামগুলি সিআর / এলএফ অন্তর্ভুক্ত করতে পারে -print0, প্রতিটি ফাইলের নামের শেষে একটি ন্যুয়াল বাইট প্রিন্ট করবে ... ঠিক তেমনি | tr -d -c "\000" | wc -lফাইলগুলি গণনা করা হচ্ছে (ন্যুয়াল বাইটস!)।

extensions="jpg png gif"
for ext in $extensions; do
  c=$(find . -maxdepth 1 -iname "*.$ext" -print0 | tr -d -c "\000" | wc -c)
  if [ $c -gt 0 ]; then
    echo "Found $c  *.$ext files"

    find . -maxdepth 1 -iname "*.$ext" -print0 | xargs -0 -r -n1 DOSOMETHINGHERE
    # or #  find . -maxdepth 1 -iname "*.$ext" -exec "ls" "-l" "{}" ";"
  fi
done

পিএস -print0 | tr -d -c "\000" | wc -cসঙ্গে -printf "\000" | wc -cবা এমনকি প্রতিস্থাপন করা যেতে পারে -printf '\n' | wc -l


0

এই সাধারণ আইএমওর জন্য কেবলমাত্র ls ব্যবহার করতে পারেন

ls -l /opt/ssl/certs/*.pem | wc -l

অথবা

count=$(ls -l /some/folder/*.jpg | wc -l)

অথবা

ls *.{mp3,exe,mp4} 2>/dev/null | wc -l

-2

আপনি যদি এক্সটেনশান সম্পর্কে নিশ্চিত হন তবে আপনি findপছন্দ মতো যেতে পারেন

find *.jpeg | wc -l

যতক্ষণ না কেউ তৈরি করে touch $'foo\nbar.jpegএবং এটি একবারের পরিবর্তে দুবার গণনা না করে। বা আরও খারাপ, কেউ করেনmkdir directory.jpeg; touch directory.jpeg/{1..100}.txt
জেফ শ্যাচলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.