ডিরেক্টরিতে ফাইলের ধরণের পুনরাবৃত্তির পরিসংখ্যান?


65

রূপান্তর প্রকল্পের জন্য একটি ওয়েবসাইট স্ক্র্যাপ করেছি। আমি সেখানে ফাইলগুলির ধরণের কয়েকটি পরিসংখ্যান করতে চাই - উদাহরণস্বরূপ, 400 .htmlফাইল, 100 .gif, ইত্যাদি এটি করার সহজ উপায় কী? এটি পুনরাবৃত্তি হতে হবে।

সম্পাদনা করুন: ম্যাক্সচেল্পজিগ যে স্ক্রিপ্টটি পোস্ট করেছে তাতে আমি যে সাইটটি স্ক্র্যাপ করেছি সেটির স্থাপত্যের কারণে আমার কিছু সমস্যা হচ্ছে। কিছু ফাইল *.php?blah=blah&foo=barবিভিন্ন যুক্তিযুক্ত নামের সাথে থাকে, তাই এটি সমস্তগুলি অনন্য হিসাবে গণ্য করে। সুতরাং সমাধানটি *.php*একই ধরণের সমস্ত হিসাবে বিবেচনা করা উচিত, তাই কথা বলতে।

উত্তর:


96

আপনি এটি ব্যবহার করতে পারেন findএবং এর uniqজন্য যেমন:

$ find . -type f | sed 's/.*\.//' | sort | uniq -c
   16 avi
   29 jpg
  136 mp3
    3 mp4

কমান্ড ব্যাখ্যা

  • find পুনরাবৃত্তভাবে সমস্ত ফাইলের নাম মুদ্রণ করে
  • sed ফাইল এক্সটেনশন পর্যন্ত প্রতিটি ফাইলের নাম থেকে উপসর্গ মুছে দেয়
  • uniq সাজানো ইনপুট ধরে
    • -c গণনা করে (হিস্টোগ্রামের মতো)

আমারও তেমন স্ক্রিপ্ট আছে। সহজ এবং দ্রুত।
রুফো এল মাগুফো

কিছু ফাইল *.php?blah=blah&foo=barবিভিন্ন যুক্তিযুক্ত নামের সাথে থাকে, তাই এটি সমস্তগুলি অনন্য হিসাবে গণ্য করে। আমি কীভাবে এটি সন্ধান করতে সংশোধন করতে পারি *.php*?
ব্যবহারকারী 394

3
আপনি একটি ভিন্ন sed 's/^.*\(\.[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]\).*$/\1/'
সেড

প্রতিটি অংশ কী করে তা ব্যাখ্যা করার জন্য সময় দেওয়ার জন্য আপনাকে ধন্যবাদ। অনুরূপ বিষয়ে এতগুলি উত্তর এই অংশটি এড়িয়ে যান। / শেখা থেকে মাছ
MechEthan

1
@ বেলা ৩৮, ছাঁটাই বৈকল্পিকগুলি শর্ট সার্কিটের মূল্যায়নের উপর নির্ভর করে - এইভাবে, আমার প্রথম সংস্করণটি find -name '.*' -prune -o -type f -printযেমন মূল্যায়ন করে: ডিরেক্টরি এন্ট্রি মিলছে .*তবে এটি ছাঁটাই করুন, অন্যথায় যদি এটি ফাইল হয় তবে এটি মুদ্রণ করুন। যেহেতু .*মিলেছে ., যেমন সিডাব্লুডি, তাই সমস্ত কিছু ছাঁটাই করা হয়, অর্থাত প্রথম ডিরেক্টরিতেও আসে না। সম্ভবত, 2 বছরের পুরানো সংস্করণগুলি findআলাদাভাবে আচরণ করেছে - বা এটি তখন আমার কেবল পর্যবেক্ষণ ছিল। যাইহোক, find -name '.*' -not -name . -prune -o -type f -printএটিকে ঠিক করে দিন।
ম্যাক্সচলেপজিগ

6

Zsh সহ:

print -rl -- **/?*.*(D.:e) | uniq -c |sort -n

প্যাটার্ন **/?*.* যাও recursively একটি এক্সটেনশন আছে সব ফাইল, বর্তমান ডিরেক্টরির মধ্যে এবং তার সাব সাথে মেলে। উল্লিখিত glob কোয়ালিফায়ার D দিন zshঢুকা এমনকি গোপন ডিরেক্টরি এবং লুকানো ফাইল বিবেচনা, .শুধুমাত্র নিয়মিত ফাইল নির্বাচন করে। ইতিহাস সংশোধক কেবল ফাইল এক্সটেনশন ধরে রাখে। print -rlপ্রতি লাইনে একটি ম্যাচ মুদ্রণ করে। uniq -cএকটানা অভিন্ন আইটেম গণনা করা (গ্লোব ফলাফল ইতিমধ্যে সাজানো হয়েছে)। sortব্যবহারের গণনা দ্বারা এক্সটেনশানগুলি বাছাই করার জন্য চূড়ান্ত কল ।


5

এই ওয়ান-লাইনারটি বেশ শক্তিশালী পদ্ধতি বলে মনে হচ্ছে:

find . -type f -printf '%f\n' | sed -r -n 's/.+(\..*)$/\1/p' | sort | uniq -c

find . -type f -printf '%f\n'কপি করে প্রিন্ট গাছ প্রতি নিয়মিত ফাইলের basename, কোন ডিরেক্টরি সঙ্গে। যে ডিরেক্টরি যা থাকতে পারে সম্পর্কে চিন্তা করতে হচ্ছে ঘটিয়েছে .আপনার তাদের 's sedRegex।

sed -r -n 's/.+(\..*)$/\1/p'আগত ফাইলের নামটি কেবলমাত্র তার এক্সটেনশান দ্বারা প্রতিস্থাপন করে। যেমন, .somefile.extহয়ে যায় .ext.+রেজেক্সে প্রাথমিকটি নোট করুন ; এক্সটেনশনের আগে কমপক্ষে একটি চরিত্রের প্রয়োজন হয় এমন কোনও মিলের ফলস্বরূপ .। এটি ফাইল নামগুলি .gitignoreযেমন কোনও নাম না থাকা এবং এক্সটেনশন '.gitignore' হিসাবে বিবেচনা করা থেকে বাধা দেয় যা সম্ভবত আপনি চান। যদি না হয়, প্রতিস্থাপন .+একটি সঙ্গে .*

বাকী রেখাটি গৃহীত উত্তর থেকে।

সম্পাদনা করুন : আপনি যদি পেরেটো চার্ট ফর্ম্যাটে সুন্দরভাবে সাজানো হিস্টোগ্রাম চান sortতবে শেষের দিকে আরও একটি যুক্ত করুন:

find . -type f -printf '%f\n' | sed -r -n 's/.+(\..*)$/\1/p' | sort | uniq -c | sort -bn

বিল্ট লিনাক্স উত্স ট্রি থেকে নমুনা আউটপুট:

    1 .1992-1997
    1 .1994-2004
    1 .1995-2002
    1 .1996-2002
    1 .ac
    1 .act2000
    1 .AddingFirmware
    1 .AdvancedTopics
    [...]
 1445 .S
 2826 .o
 2919 .cmd
 3531 .txt
19290 .h
23480 .c

1

আমি আমার ~/binফোল্ডারে exhistএই বিষয়বস্তুটির সাথে ডাকা একটি ব্যাশ স্ক্রিপ্ট রেখেছি :

#!/bin/bash

for d in */ ; do
        echo $d
        find $d -type f | sed -r 's/.*\/([^\/]+)/\1/' | sed 's/^[^\.]*$//' | sed -r 's/.*(\.[^\.]+)$/\1/' | sort | uniq -c | sort -nr
#       files only      | keep filename only          | no ext -> '' ext   | keep part after . (i.e. ext) | count          | sort by count desc
done

আমি যে ডিরেক্টরিতে আছি, আমি কেবল 'এক্স' টাইপ করি, ট্যাবটি এটি স্বয়ংক্রিয়ভাবে সম্পন্ন করে এবং আমি এরকম কিছু দেখতে পাই:

$ exhist
src/
      7 .java
      1 .txt
target/
     42 .html
     10 .class
      4 .jar
      3 .lst
      2 
      1 .xml
      1 .txt
      1 .properties
      1 .js
      1 .css

পিএসকে প্রশ্ন চিহ্নের পরে অংশটি ছাঁটাই করা সহজভাবে শেষের পরে অন্য একটি সেড কমান্ডটি করা সহজ হওয়া উচিত (আমি এটি চেষ্টা করি নি): sed 's/\?.*//'

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