निर्देशिका में फ़ाइल प्रकारों पर पुनरावर्ती आँकड़े?


65

मैंने रूपांतरण परियोजना के लिए एक वेबसाइट परिमार्जन किया। मैं वहाँ फ़ाइलों के प्रकार पर कुछ आँकड़े करना चाहते हैं - उदाहरण के लिए, 400 .htmlफ़ाइलें, 100 .gif, आदि। ऐसा करने का एक आसान तरीका क्या है? इसका पुनरावर्ती होना आवश्यक है।

संपादित करें: उस स्क्रिप्ट के साथ, जिसे मैक्सस्क्रीनहेज़िग ने पोस्ट किया है, मुझे उस साइट की वास्तुकला के कारण कुछ समस्याएं हो रही हैं, जिसे मैंने स्क्रैप किया है। कुछ फाइलें *.php?blah=blah&foo=barविभिन्न तर्कों के साथ नाम की हैं , इसलिए यह उन सभी को अद्वितीय मानती है। तो समाधान के लिए *.php*सभी को एक ही प्रकार पर विचार करने की आवश्यकता है , इसलिए बोलने के लिए।

जवाबों:


97

आप इसका उपयोग कर सकते हैं 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*?
user394

3
आप एक अलग sed 's/^.*\(\.[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]\).*$/\1/'
सेड

प्रत्येक भाग क्या करता है, यह समझाने के लिए समय निकालने के लिए धन्यवाद। समान विषयों पर इतने सारे उत्तर इस भाग को छोड़ देते हैं। / लर्निंग-टू-फिश
MechEthan

1
@ bela83, प्र्यून वेरिएंट शॉर्ट-सर्किट मूल्यांकन पर भरोसा करते हैं - इस प्रकार, मेरा पहला संस्करण इस find -name '.*' -prune -o -type f -printतरह का मूल्यांकन करता है: यदि निर्देशिका प्रविष्टि मेल खाती है .*तो इसे प्रीएन करें, अन्यथा यदि यह एक फ़ाइल है तो इसे प्रिंट करें। चूँकि .*यह भी मेल खाता है ., यानी CWD, सब कुछ छंट गया है, अर्थात पहली निर्देशिका में भी नहीं मिलता है। शायद, findअलग-अलग व्यवहार के 2 साल पुराने संस्करण - या यह सिर्फ मेरे लिए एक निरीक्षण था, वापस तो। किसी भी तरह, इसे find -name '.*' -not -name . -prune -o -type f -printठीक करता है।
मैक्सक्लेपजिग

7

Zsh के साथ:

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

पैटर्न **/?*.* रिकर्सिवली एक विस्तार है कि सभी फ़ाइलें, वर्तमान निर्देशिका में और उसकी उप-मेल खाता है। ग्लोब क्वालीफायर 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, कोई निर्देशिका के साथ। यह उन निर्देशिकाओं के बारे में चिंता करने से दूर करता है जो .आपके sedregex में हो सकती हैं ।

sed -r -n 's/.+(\..*)$/\1/p'केवल अपने विस्तार के साथ भेजे फ़ाइल नाम बदल देता है। जैसे, .somefile.extबन जाता है .ext.+रेगेक्स में प्रारंभिक नोट करें ; एक्सटेंशन के पहले कम से कम एक वर्ण की आवश्यकता वाले किसी भी मैच में यह परिणाम होता है .। यह फिल्मनामों .gitignoreको बिना नाम लिए हुए और विस्तार '.ignignore' के रूप में होने से रोकता है , जो शायद आप चाहते हैं। यदि नहीं, तो .+एक के साथ बदलें .*

शेष रेखा स्वीकृत उत्तर से है।

संपादित करें : यदि आप पारेतो चार्ट प्रारूप में अच्छी तरह से छांटे गए हिस्टोग्राम चाहते हैं , तो बस 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में इस सामग्री के साथ एक bash स्क्रिप्ट डाल दी है:

#!/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/\?.*//'

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.