ডিরেক্টরিতে প্রতিটি এক্সটেনশনের জন্য ফাইলগুলির সংখ্যা সন্ধান করুন


10

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

আমি কয়েকটি বিকল্প চেষ্টা করে দেখেছি, তবে আমি এখনও একটি কার্যকরী সমাধান খুঁজে পাইনি:

  • find "$folder" -type f | sed 's/.*\.//' | sort | uniq -cএকটি বিকল্প তবে কোনও ফাইল এক্সটেনশন না থাকলে কাজ করে না। আমার জানা দরকার যে কতগুলি ফাইলের এক্সটেনশন নেই।

  • আমি একটি অ্যারের মধ্যে একটি অনুসন্ধান লুপ চেষ্টা করেছিলাম এবং তারপরে ফলাফলগুলি যোগ করেছিলাম, কিন্তু এই সময়টি কোডটি একটি অঘোষিত ভেরিয়েবল ত্রুটি ছুঁড়েছে তবে কেবল লুপের বাইরে:

    declare -a arr
    arr=()
    echo ${arr[@]}
    

    এটি একটি অঘোষিত ভেরিয়েবল ছুঁড়ে দেয়, পাশাপাশি একবার অনুসন্ধানের লুপটি সম্পূর্ণ হয়।

উত্তর:


10
find "$path" -type f | sed -e '/.*\/[^\/]*\.[^\/]*$/!s/.*/(none)/' -e 's/.*\.//' | LC_COLLATE=C sort | uniq -c

ব্যাখ্যা:

  • find "$path" -type f "$path"ফোল্ডারে সমস্ত ফাইলের একটি পুনরাবৃত্ত তালিকা পান ।
  • sed -e '/.*\/[^\/]*\.[^\/]*$/!s/.*/(none)/' -e 's/.*\.//' নিয়মিত অভিব্যক্তি:
    • /.*\/[^\/]*\.[^\/]*$/!s/.*/(none)/ (কিছুই না) দ্বারা এক্সটেনশন ছাড়াই সমস্ত ফাইল প্রতিস্থাপন করুন।
    • s/.*\.// বাকি ফাইলগুলির এক্সটেনশন পান।
  • LC_COLLATE=C sort চিহ্নগুলি শীর্ষে রেখে ফলটি বাছাই করুন।
  • uniq -c বারবার এন্ট্রি সংখ্যা গণনা করুন।

9

পাইথন ব্যবহার:

import os
from collections import Counter
from pprint import pprint

lst = []
for file in os.listdir('./'):
        name, ext = os.path.splitext(file)
        lst.append(ext)

pprint(Counter(lst))

আউটপুট:

Counter({'': 7,
         '.png': 4,
         '.mp3': 3,
         '.jpg': 3,
         '.mkv': 3,
         '.py': 1,
         '.swp': 1,
         '.sh': 1})

আপনি সম্ভবত তালিকা ধী পার পেয়ে যাবে, মত ext = [ f.split('.')[-1] for f in os.listdir('./') ] Thatll এটা দম্পতি লাইন খাটো এবং সম্ভবত আরো Pythonic করা
Sergiy Kolodyazhnyy

পরামর্শের জন্য ধন্যবাদ, আমি এটাকে যতটা স্পষ্ট লিখতে চেষ্টা করছিলাম ...
রাভেক্সিনা

1
স্পষ্টতাই পুণ্য :) বিশেষত কোড এবং ইঞ্জিনিয়ারিং ডকুমেন্টেশনের ক্ষেত্রে এটি আসে।
সের্গেই কলডিয়াজনি

6

আপনার যদি জিএনইউ অ্যাড থাকে তবে আপনি এমন কিছু করতে পারেন

printf '%s\0' * | gawk 'BEGIN{RS="\0"; FS="."; OFS="\t"} 
  {a[(NF>1 ? $NF : "(none)")]++} 
  END{for(i in a) print a[i],i}
'

অর্থাত্ শেষ .বিচ্ছিন্ন ক্ষেত্রের উপর ভিত্তি করে একটি এসোসিয়েটিভ অ্যারের তৈরি করুন বা বৃদ্ধি করুন , বা কিছু নির্বিচার স্থির স্ট্রিং যেমন (none)কোনও এক্সটেনশন নেই।

mawkনাল-বাইট রেকর্ড বিভাজকটিকে অনুমতি দেবে বলে মনে হচ্ছে না - আপনি mawkযদি নিজের ফাইলের নামগুলিতে নতুন লাইনের সাথে ডিল করার প্রয়োজন না হন বলে আপনি আত্মবিশ্বাসী হন তবে আপনি ডিফল্ট নিউলাইন বিভাজকটি ব্যবহার করতে পারেন :

printf '%s\n' * | mawk 'BEGIN{FS="."; OFS="\t"} {a[(NF>1 ? $NF : "(none)")]++} END{for(i in a) print a[i],i}'

5

বেসিক /bin/shবা এমনকি bashকাজটি কিছুটা কঠিন হতে পারে তবে আপনি অন্যান্য উত্তরে দেখতে পারেন যে সামগ্রিক ডেটাতে কাজ করতে পারে এমন সরঞ্জামগুলি এই জাতীয় কাজটি বিশেষত সহজ করতে পারে easy যেমন একটি সরঞ্জাম sqliteডাটাবেস হবে।

sqliteডাটাবেস ব্যবহারের খুব সহজ প্রক্রিয়াটি .csvহ'ল দুটি ক্ষেত্র সহ একটি ফাইল তৈরি করা : ফাইলের নাম এবং এক্সটেনশন। পরবর্তীতে sqliteসহজ সমষ্টিগত বিবৃতি ব্যবহার করতে পারেন COUNT()সঙ্গে GROUP BY extফাইলের কাউন্টিং এক্সটেনশন ক্ষেত্রের উপর ভিত্তি করে সম্পাদন করতে

$ { printf "file,ext\n"; find -type f -exec sh -c 'f=${1##*/};printf "%s,%s\n" "${1}" "${1##*.}"' sh {} \; ; }  > files.csv
$ sqlite3 <<EOF
> .mode csv
> .import ./files.csv files_tb
> SELECT ext,COUNT(file) FROM files_tb GROUP BY ext;
> EOF
csv,1
mp3,6
txt,1
wav,27

files_tbআমার মনে হয় টেবিলটি রেফারেন্স করা হচ্ছে তবে টেবিল কলামগুলি কোথাও আমি দেখতে পাচ্ছি তার সংজ্ঞা দেওয়া হয়নি?
WinEunuuchs2Unix

@ WinEunuuchs2Unix তারা সিএসভি ফাইলেই সংজ্ঞায়িত হয়েছে। প্রথমটি printfতাই করে। এবং এসকিউএলাইট সিএসভি ফাইলের প্রথম লাইনের কলামের নাম হিসাবে বিবেচনা করবে default
সের্গেই কোলোডিয়াজনি

1
খুব চিত্তাকর্ষক! +1
WinEunuuchs2 ইউনিক্স

5

পাওয়ারশেল ব্যবহার করে যদি এটি বিকল্প হয়:

Get-ChildItem -File | Group-Object Extension -NoElement

বা সংক্ষিপ্তভাবে, এলিয়াস ব্যবহার করে:

ls -file | group -n Extension

1
কি দারুন! দুর্দান্ত প্রথম উত্তর! আমি জানতাম না লিনাক্সের জন্য পাওয়ারশেলটির অস্তিত্ব ছিল ... +1
ফ্যাবি

2
ধন্যবাদ। এটি অল্প সময়ের জন্য ক্রস-প্ল্যাটফর্ম এবং ওপেন-সোর্সটির অস্তিত্ব রয়েছে, তবে এসও এবং এসইউয়ের এমন একটি প্যাটার্ন রয়েছে যেখানে উইন্ডোজে শেল স্ক্রিপ্টিংয়ের প্রশ্নগুলির উত্তর প্রায়শই দেওয়া হয় "ওয়েল, সাইগউইন ইনস্টল করুন এবং ব্যাশ ব্যবহার করুন, তবে আপনি নিম্নলিখিতটি করতে পারেন ", সুতরাং উইন্ডোজ থেকে উদ্ভূত সরঞ্জামগুলির সাথে লিনাক্স এসই সাইটের ক্ষেত্রেও আমি একই রকম করতে দ্বিধা বোধ করছি। তবে এটি একটি দুর্দান্ত কাজ হয়েছে যা ভার্বোসিটি সম্পর্কে পুরানো যুক্তিকে আমন্ত্রণ না করে পাওয়ারশেলের শক্তিগুলি বেশ সুন্দরভাবে দেখায়।
জোয়ি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.