जवाबों:
इसे आज़माएँ (निश्चित नहीं कि यह सबसे अच्छा तरीका है, लेकिन यह काम करता है):
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
यह निम्नलिखित के रूप में काम करता है:
git ls-tree -r HEAD --name-only
find
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort | uniq -c | sort -n
पाइप के लिए कोई ज़रूरत नहीं है sort
, जाग यह सब कर सकते हैं:
find . -type f | awk -F. '!a[$NF]++{print $NF}'
alias
कमांड के लिए पूरे एक-लाइनर को उद्धरण के साथ घेरने की कोशिश कर रहे हैं, लेकिन कमांड स्वयं पहले से ही कमांड को खोजने के लिए उद्धरण का उपयोग करता है। इसे ठीक करने के लिए मैं bash
शाब्दिक स्ट्रिंग सिंटैक्स का उपयोग alias file_ext=$'find . -type f -name "*.*" | awk -F. \'!a[$NF]++{print $NF}\''
maindir/test.dir/myfile
-printf "%f\n"
'खोज' कमांड के अंत में जोड़ें और अपने परीक्षण को फिर से चलाएँ।
पुनरावर्ती संस्करण:
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
यदि आप योग चाहते हैं (विस्तार कितनी बार देखा गया था):
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort | uniq -c | sort -rn
गैर-पुनरावर्ती (एकल फ़ोल्डर):
for f in *.*; do printf "%s\n" "${f##*.}"; done | sort -u
मैं इस मंच पोस्ट पर आधारित है , क्रेडिट वहाँ जाना चाहिए।
git show --name-only --pretty="" | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
शक्ति कोशिका:
dir -recurse | select-object extension -unique
के लिए धन्यवाद http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html
.
उनमें है (जैसे आउटपुट में jquery-1.3.4
दिखाएगा .4
)। dir -file -recurse | select-object extension -unique
केवल फ़ाइल एक्सटेंशन प्राप्त करने के लिए बदलें ।
मेरा awk-less, sed-less, Perl-less, Python-less POSIX-compliant वैकल्पिक:
find . -type f | rev | cut -d. -f1 | rev | tr '[:upper:]' '[:lower:]' | sort | uniq --count | sort -rn
चाल यह है कि यह लाइन को उलट देता है और शुरुआत में विस्तार को काट देता है।
यह एक्सटेंशन को लोअर केस में भी परिवर्तित करता है।
उदाहरण आउटपुट:
3689 jpg
1036 png
610 mp4
90 webm
90 mkv
57 mov
12 avi
10 txt
3 zip
2 ogv
1 xcf
1 trashinfo
1 sh
1 m4v
1 jpeg
1 ini
1 gqv
1 gcs
1 dv
uniq
पूरा झंडा नहीं है --count
, लेकिन -c
ठीक काम करता है
हर बिंदु को एक बिंदु के साथ खोजें और केवल प्रत्यय दिखाएं।
find . -type f -name "*.*" | awk -F. '{print $NF}' | sort -u
यदि आप जानते हैं कि सभी प्रत्यय में 3 वर्ण हैं
find . -type f -name "*.???" | awk -F. '{print $NF}' | sort -u
या सेड के साथ एक से चार वर्णों के साथ सभी प्रत्यय दिखाई देते हैं। प्रत्यय में आप जिन वर्णों की अपेक्षा कर रहे हैं, उन्हें {1,4} बदलें।
find . -type f | sed -n 's/.*\.\(.\{1,4\}\)$/\1/p'| sort -u
मिश्रण के लिए मेरी अपनी विविधता जोड़ना। मुझे लगता है कि यह बहुत सरल है और उपयोगी हो सकता है जब दक्षता कोई बड़ी चिंता नहीं है।
find . -type f | grep -o -E '\.[^\.]+$' | sort -u
$ find . -type f | grep -o -E '\.[^.\/]+$' | sort -u
पायथन में रिक्त एक्सटेंशन सहित बहुत बड़ी निर्देशिकाओं के लिए जनरेटर का उपयोग करते हुए, और प्रत्येक एक्सटेंशन को जितनी बार दिखाता है, उतनी बार प्राप्त होता है:
import json
import collections
import itertools
import os
root = '/home/andres'
files = itertools.chain.from_iterable((
files for _,_,files in os.walk(root)
))
counter = collections.Counter(
(os.path.splitext(file_)[1] for file_ in files)
)
print json.dumps(counter, indent=2)
मैंने यहाँ उत्तरों का एक गुच्छा आज़माया, यहाँ तक कि "सर्वश्रेष्ठ" उत्तर भी। वे सभी उस चीज से कम आए जो मैं विशेष रूप से था। तो पिछले 12 घंटों के अलावा regex कोड में कई कार्यक्रमों के लिए बैठना और इन उत्तरों को पढ़ना और परीक्षण करना यह वही है जो मैं लेकर आया हूं जो बिल्कुल वैसे ही काम करता है जैसे मैं चाहता हूं।
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort -u
यदि आपको फ़ाइल एक्सटेंशन की गिनती की आवश्यकता है, तो नीचे दिए गए कोड का उपयोग करें
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort | uniq -c | sort -rn
हालांकि इन विधियों को पूरा होने में कुछ समय लगेगा और शायद समस्या के बारे में जाने के सर्वोत्तम तरीके नहीं हैं, वे काम करते हैं।
अपडेट: प्रति @ अल्फा_989 लंबी फ़ाइल एक्सटेंशन एक समस्या का कारण होगा। यह मूल रेगेक्स "[[: अल्फा:]] {3,6}" के कारण है। मैंने रेगेक्स "[[: अल्फा:]]] {2,16}" को शामिल करने के उत्तर को अपडेट किया है। हालाँकि, इस कोड का उपयोग करने वाले किसी को भी इस बात की जानकारी होनी चाहिए कि वे संख्याएँ अधिकतम हैं और अंतिम आउटपुट के लिए एक्सटेंशन की अनुमति कब तक है। उस सीमा के बाहर कुछ भी आउटपुट में कई लाइनों में विभाजित हो जाएगा।
नोट: ओरिजिनल पोस्ट ने पढ़ा "- 3 और 6 अक्षरों के बीच फ़ाइल एक्सटेंशन के लिए ग्रीप्स (यदि वे आपकी ज़रूरत के अनुसार फिट नहीं हैं तो बस संख्याओं को समायोजित करें)। यह कैश फ़ाइलों और सिस्टम फ़ाइलों (सिस्टम फ़ाइल बिट जेल की खोज के लिए) से बचने में मदद करता है। "
आइडिया: एक विशिष्ट लंबाई पर फ़ाइल एक्सटेंशन खोजने के लिए इस्तेमाल किया जा सकता है:
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{4,}" | awk '{print tolower($0)}' | sort -u
जहां 4 फाइल एक्सटेंशन लंबाई शामिल करने के लिए है और फिर उस लंबाई से परे किसी भी एक्सटेंशन को ढूंढें।
चूंकि पहले से ही एक और समाधान है जो पर्ल का उपयोग करता है:
यदि आपके पास पायथन स्थापित है तो आप भी कर सकते हैं (शेल से):
python -c "import os;e=set();[[e.add(os.path.splitext(f)[-1]) for f in fn]for _,_,fn in os.walk('/home')];print '\n'.join(e)"
अब तक कोई भी जवाब नए नामों के साथ फिल्म्स के साथ ठीक से व्यवहार नहीं करता (सिवाय क्रिस्टोफीडी के, जो अभी आया था क्योंकि मैं इसे टाइप कर रहा था)। निम्नलिखित एक खोल-लाइनर नहीं है, लेकिन काम करता है, और यथोचित तेज़ है।
import os, sys
def names(roots):
for root in roots:
for a, b, basenames in os.walk(root):
for basename in basenames:
yield basename
sufs = set(os.path.splitext(x)[1] for x in names(sys.argv[1:]))
for suf in sufs:
if suf:
print suf
मुझे नहीं लगता कि यह अभी तक उल्लेख किया गया था:
find . -type f -exec sh -c 'echo "${0##*.}"' {} \; | sort | uniq -c
मैंने इसे सरल और तेज़ पाया है ...
# find . -type f -exec basename {} \; | awk -F"." '{print $NF}' > /tmp/outfile.txt
# cat /tmp/outfile.txt | sort | uniq -c| sort -n > tmp/outfile_sorted.txt
स्वीकृत उत्तर REGEX का उपयोग करता है और आप REGEX के साथ एक उपनाम आदेश नहीं बना सकते हैं, आपको इसे एक शेल स्क्रिप्ट में डालना होगा, मैं Amazon Linux 2 का उपयोग कर रहा हूं और निम्नलिखित कार्य किया है:
मैंने उपयोग किए गए उत्तर कोड को एक फ़ाइल में डाला:
सुडो विम खोज.श
इस कोड को जोड़ें:
find ./ -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
टाइप करके फाइल सेव करें: :wq!
sudo vim ~/.bash_profile
alias getext=". /path/to/your/find.sh"
:wq!
. ~/.bash_profile
.svn
), तोfind . -type f -path '*/.svn*' -prune -o -print | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
स्रोत का