Zrobiłem scrape strony internetowej dla projektu konwersji. Chciałbym zrobić kilka statystyk dotyczących rodzajów plików tam zawartych - na przykład 400 .html
plików, 100 .gif
itd. Jak to łatwo zrobić? To musi być rekurencyjne.
Edycja: Ze skryptem opublikowanym przez maxschelpzig mam problemy z architekturą strony, którą zeskrobałem. Niektóre pliki mają *.php?blah=blah&foo=bar
różne argumenty, dlatego wszystkie są traktowane jako unikalne. Tak więc rozwiązanie należy uznać *.php*
za tego samego typu, że tak powiem.
*.php?blah=blah&foo=bar
różne argumenty, dlatego wszystkie są traktowane jako unikalne. Jak mogę go zmienić, aby szukać*.php*
?sed 's/^.*\(\.[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]\).*$/\1/'
find -name '.*' -prune -o -type f -print
ocenia następująco: jeśli wpis katalogu pasuje,.*
to przycinaj go, w przeciwnym razie, jeśli jest to plik, wydrukuj go. Ponieważ.*
także pasuje.
, tj. CWD, wszystko jest przycinane, tzn. Find nawet nie schodzi do pierwszego katalogu. Być może 2 lata stare wersjefind
zachowywał się różnie - czy była to tylko przeoczenie ze mnie wtedy. W każdym raziefind -name '.*' -not -name . -prune -o -type f -print
to naprawia.Z zsh:
Wzór
**/?*.*
pasuje do wszystkich plików, które mają rozszerzenie w bieżącym katalogu i jego podkatalogów rekurencyjnie. Glob kwalifikatorD
niechzsh
trawers nawet ukryte katalogi i rozważyć ukryte pliki,.
wybiera tylko zwykłe pliki. Historia modyfikator zachowuje jedynie rozszerzenie pliku.print -rl
drukuje jedno dopasowanie w linii.uniq -c
liczy kolejne identyczne elementy (wynik globu jest już posortowany). Ostatnie wywołaniesort
sortujące rozszerzenia według liczby użytkowników.źródło
Ten jednowarstwowy wydaje się być dość solidną metodą:
Wyświetla
find . -type f -printf '%f\n'
basename każdego zwykłego pliku w drzewie, bez katalogów. To eliminuje konieczność martwienia się o katalogi, które mogą znajdować.
się w twoimsed
wyrażeniu regularnym.sed -r -n 's/.+(\..*)$/\1/p'
Zastępuje przychodzącego pliku tylko jego przedłużenia. Np ..somefile.ext
Staje się.ext
. Zwróć uwagę na inicjał.+
wyrażenia regularnego; skutkuje to każdym dopasowaniem wymagającym przynajmniej jednego znaku przed rozszerzeniem.
. Zapobiega.gitignore
to traktowaniu nazw plików, takich jak brak nazwy, i rozszerzeniu „.gitignore”, które prawdopodobnie jest tym, czego chcesz. Jeśli nie, wymień.+
z.*
.Reszta linii pochodzi z zaakceptowanej odpowiedzi.
Edycja : Jeśli chcesz dobrze posortowany histogram w formacie wykresu Pareto , po prostu dodaj kolejny
sort
na końcu:Przykładowe dane wyjściowe z wbudowanego drzewa źródeł Linux:
źródło
W moim
~/bin
folderze umieściłem skrypt bashexhist
o tej treści:Niezależnie od tego, w którym katalogu się znajduję, po prostu wpisuję „exh”, karta automatycznie go uzupełnia i widzę coś takiego:
PS Przycinanie części po znaku zapytania powinno być łatwe do wykonania z innym poleceniem sed prawdopodobnie po ostatnim (nie próbowałem):
sed 's/\?.*//'
źródło