Chcę policzyć liczbę plików dla każdego rozszerzenia w katalogu, a także pliki bez rozszerzenia.
Wypróbowałem kilka opcji, ale nie znalazłem jeszcze działającego rozwiązania:
find "$folder" -type f | sed 's/.*\.//' | sort | uniq -c
jest opcją, ale nie działa, jeśli nie ma rozszerzenia pliku. Muszę wiedzieć, ile plików nie ma rozszerzenia.Próbowałem również znaleźć pętlę find w tablicy, a następnie zsumować wyniki, ale w tym momencie ten kod zgłasza niezadeklarowany błąd zmiennej, ale tylko poza pętlą:
declare -a arr arr=() echo ${arr[@]}
Zgłasza to niezadeklarowaną zmienną, a także po zakończeniu pętli wyszukiwania.
command-line
find
extension
chłopiec z ciągnika
źródło
źródło
ext = [ f.split('.')[-1] for f in os.listdir('./') ]
Thatll skraca kilka linii i może jest bardziej PythonicJeśli masz GNU awk, możesz zrobić coś takiego
tj. konstruuj / zwiększaj tablicę asocjacyjną wpisaną w ostatnim
.
oddzielonym polu lub dowolny ustalony ciąg znaków, na przykład(none)
jeśli nie ma rozszerzenia.mawk
wydaje się nie dopuszczać separatora rekordów zerowych - możesz użyćmawk
domyślnego separatora nowej linii, jeśli masz pewność, że nie musisz zajmować się znakami nowej linii w nazwach plików:źródło
Z podstawowym,
/bin/sh
a nawetbash
zadaniem może być trochę trudne, ale jak widać w innych odpowiedziach, narzędzia, które mogą pracować na agregowanych danych, mogą szczególnie łatwo poradzić sobie z takim zadaniem. Jednym z takich narzędzi byłabysqlite
baza danych.Bardzo prostym procesem korzystania z
sqlite
bazy danych byłoby utworzenie.csv
pliku z dwoma polami: nazwą pliku i rozszerzeniem. Późniejsqlite
można użyć prostego zbiorczą deklaracjęCOUNT()
zeGROUP BY ext
przeprowadzić liczenie plików na podstawie rozszerzenia polaźródło
files_tb
tabela, o której myślę, że jest przywoływana, ale kolumny tabeli nie są zdefiniowane nigdzie, co widzę?printf
robi pierwszy . A SQLite domyślnie traktuje pierwszą linię pliku csv jako nazwy kolumn.Używanie programu PowerShell, jeśli jest to opcja:
lub krócej, używając aliasów:
źródło