Yanıtlar:
Bunu deneyin (en iyi yol olup olmadığından emin değilim, ama işe yarıyor):
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
Aşağıdaki gibi çalışır:
git ls-tree -r HEAD --name-only
yerinefind
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort | uniq -c | sort -n
Boruya gerek yok sort
, awk her şeyi yapabilir:
find . -type f | awk -F. '!a[$NF]++{print $NF}'
alias
komut için tırnak işaretleri ile tek satırın tamamını çevrelemeye çalışmanızdır, ancak komutun kendisi zaten find komutunda tırnak işaretleri kullanır. Bunu düzeltmek için bash
's literal dize sözdizimini şöyle kullanırdım :alias file_ext=$'find . -type f -name "*.*" | awk -F. \'!a[$NF]++{print $NF}\''
maindir/test.dir/myfile
-printf "%f\n"
'find' komutunun sonuna ekleyin ve testinizi yeniden çalıştırın.
Özyinelemeli sürüm:
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
Toplamlar istiyorsanız (uzantının nasıl göründüğü):
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort | uniq -c | sort -rn
Özyinelemesiz (tek klasör):
for f in *.*; do printf "%s\n" "${f##*.}"; done | sort -u
Ben bu forum yazı üzerine dayanıyorum , kredi oraya gitmek gerekir.
git show --name-only --pretty="" | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
Güç kalkanı:
dir -recurse | select-object extension -unique
Http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html sayesinde
.
olan dizinleri de alır (örneğin çıktıdaki jquery-1.3.4
gibi görünecektir .4
). dir -file -recurse | select-object extension -unique
Yalnızca dosya uzantılarını almak için olarak değiştirin .
Awk-less, sed-less, Perl-less, Python'suz POSIX uyumlu alternatifim:
find . -type f | rev | cut -d. -f1 | rev | tr '[:upper:]' '[:lower:]' | sort | uniq --count | sort -rn
Hüner, çizgiyi tersine çevirip başlangıçta uzantıyı kesmesidir.
Ayrıca uzantıları küçük harfe dönüştürür.
Örnek çıktı:
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
tam bayrağı yok --count
, ama iyi -c
çalışıyor
Her şeyi bir nokta ile bulun ve sadece soneki gösterin.
find . -type f -name "*.*" | awk -F. '{print $NF}' | sort -u
tüm son ekin 3 karakteri olduğunu biliyorsan
find . -type f -name "*.???" | awk -F. '{print $NF}' | sort -u
veya sed ile bir ila dört karakter içeren tüm sonekleri gösterir. {1,4} ile sonekde beklediğiniz karakter aralığını değiştirin.
find . -type f | sed -n 's/.*\.\(.\{1,4\}\)$/\1/p'| sort -u
Karışıma kendi varyasyonumu ekliyorum. Bence bu en basit olanı ve verimlilik büyük bir endişe olmadığında yararlı olabilir.
find . -type f | grep -o -E '\.[^\.]+$' | sort -u
$ find . -type f | grep -o -E '\.[^.\/]+$' | sort -u
Python'da boş uzantılar da dahil olmak üzere çok büyük dizinler için jeneratörler kullanan ve her uzantının kaç kez görüntülendiğini gösteren:
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)
Burada bir sürü cevap denedim, hatta "en iyi" yanıtı bile. Hepsi benim peşinde olduğum şeyden kısa bir süre geldi. Yani son 12 saat içinde birden fazla program için regex kodunda oturan ve bu cevapları okuyup test etmenin yanı sıra tam olarak istediğim gibi çalışan şey budur.
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort -u
Bir dizi dosya uzantısına ihtiyacınız varsa aşağıdaki kodu kullanın
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort | uniq -c | sort -rn
Bu yöntemlerin tamamlanması biraz zaman alacaktır ve muhtemelen sorunla ilgili en iyi yol değildir, ancak işe yararlar.
Güncelleme: @ @ alpha_989 başına uzun dosya uzantıları soruna neden olur. Bunun nedeni, orijinal regex "[[: alpha:]] {3,6}". Cevabı, "[[: alpha:]] {2,16}" normal ifadesini içerecek şekilde güncelledim. Ancak bu kodu kullanan herkes, bu sayıların, son çıktı için uzantının izin verilen süresinin min ve maks olduğunu bilmelidir. Bu aralığın dışındaki her şey çıktıda birden çok satıra bölünecektir.
Not: Orijinal yazı okundu "- 3 ile 6 karakter arasında dosya uzantıları için Greps (sadece ihtiyacınıza uygun değilse sayıları ayarlayın). "
Fikir: Aşağıdaki yollarla belirli bir uzunluktaki dosya uzantılarını bulmak için kullanılabilir:
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{4,}" | awk '{print tolower($0)}' | sort -u
Burada 4, eklenecek dosya uzantıları uzunluğudur ve daha sonra bu uzunluktan sonraki uzantıları da bulur.
Perl kullanan başka bir çözüm olduğundan:
Yüklü Python varsa şunları da yapabilirsiniz (kabuktan):
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)"
Şimdiye kadar gelen yanıtların hiçbiri yeni satırlarla dosya adlarıyla düzgün bir şekilde ilgilenmiyor (bunu yazarken gelen ChristopheD'ler hariç). Aşağıdaki bir kabuk tek astar değil, işe yarıyor ve oldukça hızlı.
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
Bu henüz bahsedildi sanmıyorum:
find . -type f -exec sh -c 'echo "${0##*.}"' {} \; | sort | uniq -c
Basit ve hızlı buldum ...
# 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
Kabul edilen cevap REGEX kullanır ve REGEX ile bir diğer ad komutu oluşturamazsınız, bir kabuk betiğine koymanız gerekir, Amazon Linux 2 kullanıyorum ve aşağıdakileri yaptım:
Kabul edilen cevap kodunu kullanarak bir dosyaya koydum:
sudo vim find.sh
bu kodu ekle:
find ./ -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
şunu yazarak dosyayı kaydedin: :wq!
sudo vim ~/.bash_profile
alias getext=". /path/to/your/find.sh"
:wq!
. ~/.bash_profile
.svn
) dışında tutmak istiyorsanız ,find . -type f -path '*/.svn*' -prune -o -print | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
kaynak