Ich habe ein Website-Scrape für ein Conversion-Projekt durchgeführt. Ich möchte einige Statistiken über die Dateitypen dort erstellen - zum Beispiel 400 .html
Dateien, 100 .gif
usw. Was ist ein einfacher Weg, dies zu tun? Es muss rekursiv sein.
Bearbeiten: Mit dem Skript, das maxschelpzig gepostet hat, habe ich einige Probleme aufgrund der Architektur der Website, die ich geschabt habe. Einige der Dateien haben den Namen *.php?blah=blah&foo=bar
mit verschiedenen Argumenten, sodass sie alle als eindeutig gelten. Die Lösung muss *.php*
also sozusagen alle vom selben Typ sein.
*.php?blah=blah&foo=bar
mit verschiedenen Argumenten, sodass sie alle als eindeutig gelten. Wie kann ich es ändern, um zu suchen*.php*
?sed 's/^.*\(\.[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]\).*$/\1/'
find -name '.*' -prune -o -type f -print
wertet also wie.*
folgt aus : Wenn der Verzeichniseintrag übereinstimmt, dann schneide ihn ab, andernfalls, wenn es sich um eine Datei handelt, drucke ihn aus. Da.*
auch Übereinstimmungen.
, dh der CWD, vorhanden sind, wird alles gelöscht, dh find steigt nicht einmal in das erste Verzeichnis ab. Vielleichtfind
verhielten sich 2 Jahre alte Versionen anders - oder es war damals nur ein Versehen von mir. Jedenfallsfind -name '.*' -not -name . -prune -o -type f -print
behebt dies.Mit zsh:
Das Muster
**/?*.*
entspricht rekursiv allen Dateien mit einer Erweiterung im aktuellen Verzeichnis und seinen Unterverzeichnissen. Mit dem Glob-Qualifikator könnenD
Siezsh
sogar versteckte Verzeichnisse durchlaufen und versteckte Dateien berücksichtigen. Dabei werden.
nur normale Dateien ausgewählt. Der Verlaufsmodifikator behält nur die Dateierweiterung bei.print -rl
druckt eine Übereinstimmung pro Zeile.uniq -c
zählt aufeinanderfolgende identische Elemente (das Glob-Ergebnis ist bereits sortiert). Der letzte Aufruf zumsort
Sortieren der Nebenstellen nach Verwendungsanzahl.quelle
Dieser Einzeiler scheint eine ziemlich robuste Methode zu sein:
Das
find . -type f -printf '%f\n'
druckt den Basisnamen jeder regulären Datei im Baum ohne Verzeichnisse. So müssen Sie sich keine Gedanken mehr über Verzeichnisse machen, die möglicherweise.
in Ihremsed
regulären Ausdruck enthalten sind.Das
sed -r -n 's/.+(\..*)$/\1/p'
ersetzt den eingehenden Dateinamen nur mit seiner Erweiterung. ZB.somefile.ext
wird.ext
. Beachten Sie die Initiale.+
im regulären Ausdruck. Dies führt dazu, dass eine Übereinstimmung mindestens ein Zeichen vor der Erweiterung benötigt.
. Dies verhindert, dass Dateinamen wie.gitignore
".gitignore" so behandelt werden, dass sie überhaupt keinen Namen haben, und dass die Erweiterung ".gitignore" angezeigt wird. Wenn nicht, ersetzen Sie die.+
durch a.*
.Der Rest der Zeile stammt aus der akzeptierten Antwort.
Bearbeiten : Wenn Sie ein gut sortiertes Histogramm im Pareto-Diagrammformat wünschen , fügen Sie
sort
am Ende einfach ein weiteres hinzu :Beispielausgabe aus einem erstellten Linux-Quelltextbaum:
quelle
Ich habe ein Bash-Skript mit folgendem Inhalt in meinen
~/bin
Ordner gelegtexhist
:Egal in welchem Verzeichnis ich mich befinde, ich gebe einfach 'exh' ein, der Tabulator vervollständigt es automatisch und ich sehe so etwas:
PS Das Trimmen des Teils nach dem Fragezeichen sollte einfach mit einem anderen sed-Befehl möglich sein, wahrscheinlich nach dem letzten (ich habe es nicht ausprobiert):
sed 's/\?.*//'
quelle