निर्देशिका में प्रत्येक एक्सटेंशन के लिए फ़ाइलों की संख्या का पता लगाएं


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 बनाने
सर्गी 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कि कार्य थोड़ा मुश्किल हो सकता है, लेकिन जैसा कि आप अन्य उत्तरों में देख सकते हैं कि कुल डेटा पर काम करने वाले उपकरण ऐसे कार्य से निपट सकते हैं विशेष रूप से आसान। ऐसा एक उपकरण 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करता है। और SQLite स्तंभ नामों के रूप में csv फ़ाइल की पहली पंक्ति के इलाज के लिए डिफ़ॉल्ट होगा।
सेर्गेई कोलोडियाज़नी

1
बहुत प्रभावशाली! +1
WinEunuuchs2Unix 21

5

यदि यह विकल्प है तो PowerShell का उपयोग करना :

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

या कम, उपनाम का उपयोग कर:

ls -file | group -n Extension

1
वाह! शानदार पहला जवाब! मैं यह भी नहीं जानता था कि PowerShell लिनक्स के लिए अस्तित्व में है ... +1
Fabby

2
धन्यवाद। इसमें कुछ समय के लिए क्रॉस-प्लेटफ़ॉर्म और ओपन-सोर्स मौजूद है, लेकिन एसओ और एसयू पर एक पैटर्न है जहां विंडोज पर शेल स्क्रिप्टिंग के लिए अक्सर सवालों के जवाब दिए गए हैं "ठीक है, साइबरविन स्थापित करें और बैश का उपयोग करें, तो आप निम्नलिखित कर सकते हैं ", इसलिए मुझे विंडोज़ पर उत्पन्न होने वाले टूल के साथ लिनक्स एसई साइटों के लिए ऐसा करने में संकोच हुआ है। लेकिन यह एक अच्छा काम है जो वर्बोसिटी के बारे में पुराने तर्क को आमंत्रित किए बिना पावरशेल की ताकत को काफी अच्छी तरह से दिखाता है।
जॉय
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.