Odpowiedzi:
Spróbuj tego (nie jestem pewien, czy to najlepszy sposób, ale działa):
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
Działa w następujący sposób:
git ls-tree -r HEAD --name-only
zamiastfind
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort | uniq -c | sort -n
Nie potrzeba do rury sort
, awk można zrobić wszystko:
find . -type f | awk -F. '!a[$NF]++{print $NF}'
alias
polecenia, ale samo polecenie już używa cudzysłowów w poleceniu find. Aby to naprawić, bash
alias file_ext=$'find . -type f -name "*.*" | awk -F. \'!a[$NF]++{print $NF}\''
maindir/test.dir/myfile
-printf "%f\n"
na końcu polecenia „znajdź” i ponownie uruchom test.
Wersja rekurencyjna:
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
Jeśli chcesz mieć sumy (jak może być widoczne rozszerzenie):
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort | uniq -c | sort -rn
Brak rekurencji (pojedynczy folder):
for f in *.*; do printf "%s\n" "${f##*.}"; done | sort -u
Oparłem to na tym wpisie na forum , kredyt powinien się tam znaleźć.
git show --name-only --pretty="" | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
PowerShell:
dir -recurse | select-object extension -unique
Dzięki http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html
.
w nich (np. jquery-1.3.4
Pokażą się jak .4
na wyjściu). Zmień, aby dir -file -recurse | select-object extension -unique
uzyskać tylko rozszerzenia plików.
Moja bezkompromisowa, bez sed, bez Perla, bez Pythona alternatywa zgodna z POSIX:
find . -type f | rev | cut -d. -f1 | rev | tr '[:upper:]' '[:lower:]' | sort | uniq --count | sort -rn
Sztuka polega na tym, że odwraca on linię i odcina rozszerzenie na początku.
Konwertuje również rozszerzenia na małe litery.
Przykładowe dane wyjściowe:
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
nie ma pełnej flagi --count
, ale -c
działa dobrze
Znajdź wszystko za pomocą kropki i pokaż tylko przyrostek.
find . -type f -name "*.*" | awk -F. '{print $NF}' | sort -u
jeśli wiesz, że wszystkie przyrostki mają 3 znaki, to
find . -type f -name "*.???" | awk -F. '{print $NF}' | sort -u
lub z sesem pokazuje wszystkie sufiksy od jednego do czterech znaków. Zmień {1,4} na zakres znaków, których oczekujesz w sufiksie.
find . -type f | sed -n 's/.*\.\(.\{1,4\}\)$/\1/p'| sort -u
Dodanie własnej odmiany do miksu. Myślę, że jest to najprostszy z możliwych i może być użyteczny, gdy wydajność nie stanowi dużego problemu.
find . -type f | grep -o -E '\.[^\.]+$' | sort -u
$ find . -type f | grep -o -E '\.[^.\/]+$' | sort -u
W Pythonie używanie generatorów dla bardzo dużych katalogów, w tym pustych rozszerzeń, i uzyskiwanie liczby wyświetleń każdego rozszerzenia:
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)
Próbowałem tutaj wielu odpowiedzi, nawet „najlepszych”. Wszyscy wymyślili coś, czego nie chciałem. Oprócz ostatnich 12 godzin siedzenia w kodzie wyrażeń regularnych dla wielu programów oraz czytania i testowania tych odpowiedzi, to właśnie wymyśliłem, który działa DOKŁADNIE tak, jak chcę.
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort -u
Jeśli potrzebujesz liczby rozszerzeń plików, użyj poniższego kodu
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort | uniq -c | sort -rn
Chociaż wykonanie tych metod zajmie trochę czasu i prawdopodobnie nie są to najlepsze sposoby rozwiązania problemu, działają one.
Aktualizacja: Rozszerzenia plików Per @ alpha_989 spowodują problem. Wynika to z pierwotnego wyrażenia regularnego „[[: alpha:]] {3,6}”. Zaktualizowałem odpowiedź, dodając wyrażenie „[[: alpha:]] {2,16}”. Jednak każdy, kto używa tego kodu, powinien mieć świadomość, że liczby te są minimalną i maksymalną długością dozwolonego rozszerzenia dla końcowego wyniku. Wszystko poza tym zakresem zostanie podzielone na wiele wierszy na wyjściu.
Uwaga: w oryginalnym poście było napisane „- Greps dla rozszerzeń plików od 3 do 6 znaków (po prostu dostosuj liczby, jeśli nie pasują do twoich potrzeb). Pomaga to uniknąć plików pamięci podręcznej i plików systemowych (bit pliku systemowego służy do wyszukiwania w więzieniu). „
Pomysł: może być używany do znajdowania rozszerzeń plików o określonej długości za pomocą:
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{4,}" | awk '{print tolower($0)}' | sort -u
Gdzie 4 to długość rozszerzeń plików, które należy uwzględnić, a następnie znajdź także wszelkie rozszerzenia poza tą długością.
Ponieważ istnieje już inne rozwiązanie korzystające z Perla:
Jeśli masz zainstalowany Python, możesz również zrobić (z powłoki):
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)"
Żadna z dotychczasowych odpowiedzi nie dotyczy poprawnie nazw plików z nowymi wierszami (z wyjątkiem ChristopheD, które właśnie pojawiły się podczas pisania tego tekstu). Poniższy przykład nie jest pojedynczą linią powłoki, ale działa i jest dość szybki.
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
Nie sądzę, żeby ten był jeszcze wspomniany:
find . -type f -exec sh -c 'echo "${0##*.}"' {} \; | sort | uniq -c
Znalazłem to proste i szybkie ...
# 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
Zaakceptowana odpowiedź używa REGEX i nie możesz utworzyć polecenia aliasu za pomocą REGEX, musisz umieścić go w skrypcie powłoki, używam Amazon Linux 2 i wykonałem następujące czynności:
Wstawiam zaakceptowany kod odpowiedzi do pliku, używając:
sudo vim find.sh
dodaj ten kod:
find ./ -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
zapisz plik, wpisując: :wq!
sudo vim ~/.bash_profile
alias getext=". /path/to/your/find.sh"
:wq!
. ~/.bash_profile
.svn
), użyjfind . -type f -path '*/.svn*' -prune -o -print | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
źródła