Wie kann ich mit word counter ( wc
) und Piping zählen, wie viele Dateien oder Verzeichnisse sich im /usr/bin
Verzeichnis befinden?
scripting
find
wc
file-types
Kasse
quelle
quelle
Antworten:
Ein Ansatz wäre
ls
, uns eine Liste der Dateien zu geben, aber wir möchten, dass diese Liste garantiert nur 1 Datei oder Verzeichnis pro Zeile anzeigt. Der-1
Schalter erledigt dies für uns.Beispiel
Erstellen Sie die obigen Beispieldaten in einem leeren Verzeichnis.
Prüfen Sie:
Zum Zählen können Sie jetzt
wc -l
die Anzahl der Zeilen zählen, die einer Datei oder einem Verzeichnis in derls -1
Ausgabe entsprechen.(Beachten Sie jedoch, dass die versteckten Dateien nicht enthalten sind.)
Dateien oder Verzeichnisse zählen, nur nicht zusammen
Um entweder Dateien oder Verzeichnisse zu zählen, müssen Sie Ihre Taktik leicht ändern. In diesem Fall würde ich verwenden,
ls -l
da es zeigt, was ein Verzeichnis und was eine Datei ist.Beispiel
Dann können wir
grep
Verzeichnisse oder Nicht-Verzeichnisse wie folgt herausfiltern:Verwenden Sie jetzt einfach noch
wc -l
einmal, um Folgendes zu zählen:Obwohl, können Sie vermeiden ,
wc
überhaupt, und die Verwendunggrep
‚s-c
Option:(Auch hier sind versteckte Dateien nicht enthalten. Beachten Sie, dass Verzeichnisse und reguläre Dateien zwei Arten von Dateien sind. Es gibt viele weitere wie Named Pipes, symbolische Links, Geräte, Sockets ...).
Rekursion
Wenn Sie die Dateien und Verzeichnisse rekursiv unter finden müssen,
/usr/bin
möchten Sie wahrscheinlich die Taktik vollständig ändern und ein anderes Tool namens verwendenfind
.Beispiel
(obwohl über sich
/usr/bin
selbst in der Zählung enthalten ist)Die gleichen Techniken, die ich oben verwendet habe, könnten verwendet werden
ls
, um etwas Ähnliches zu tun, sind jedochls
im Allgemeinen kein gutes Werkzeug zum Parsen der Ausgabe.find
Auf der anderen Seite wurde dafür gebaut und bietet Schalter, um entweder Dateien oder Verzeichnisse zu finden.(Beachten Sie, dass diesmal
find
versteckte Dateien enthalten sind (außer.
und..
)).Newlines?
Ich habe nie herausgefunden, warum ein Zeilenumbruchzeichen ein zulässiges Zeichen beim Erstellen von Dateinamen oder Verzeichnisnamen ist. Die oben diskutierten Methoden verwenden diese
wc
undls
würden nicht mit diesen konkurrieren. Verwenden Sie sie daher in diesem Sinne.Beispiel
Erstellen Sie ein Verzeichnis und einen Dateinamen mit Zeilenumbrüchen.
ls
zeigt sie richtig:Aber
wc
zählt die Verzeichnisse und Dateien , die Zeilenumbrüche als 2 Elemente enthalten, nicht ein.Eine Methode, um dies zu umgehen, wenn Sie die GNU-Implementierung von verwenden,
find
besteht darin, diefind
Fähigkeit zu nutzen , anstelle jeder gefundenen Datei etwas anderes zu drucken und diese stattdessen zu zählen.Beispiel
Hier finden wir alles im aktuellen Verzeichnis (außer
..
) und drucken jeweils einen Punkt (.
) und zählen dann die Punkte, indem wir diewc
Fähigkeit verwenden, Bytes anstelle von Zeilen zu zählenwc -c
.Verweise
quelle
/usr/bin
alle Dateien in gut formatiert sein werden (und auch keine Leerzeichen enthalten, so dass Sie dies technisch gesehen auch nur tun könnenecho * | wc -w
), ist es erwähnenswert, dass all diese Dateien bei Dateinamen mit Zeilenumbrüchen beschädigt werden.ls -l
oderls -1
wird b / c brechen wir zählen Zeilen, keine Wörter! Dasfind
mag brechen, aber wir zählen wieder Zeilen, keine Wörter.touch $'foo\nbar'
einem leeren Verzeichnis, gefolgt von einem Ihrer Befehle (z. B.ls -1 | wc -l
), werden zwei statt einer Datei gemeldet, da diese eine Datei aus zwei Zeilenwc
besteht. Es sei denn, erls
ersetzt Zeilenumbrüche durch einen anderen Charakter (ich glaube nicht, aber ich bin momentan nicht in der Lage zu testen).wc -c
ein Problem beim Zählen der Perioden?Wenn Sie mit GNU eine rekursive Aufschlüsselung der Anzahl der einzelnen Dateitypen unter einem bestimmten Verzeichnis erhalten möchten
find
, haben Sie folgende Möglichkeiten:Auf
/usr/bin
meinem System gibt das:Am
/dev
:Wenn Sie Symlinks lieber als den Typ der Datei zählen möchten, auf die sie verweisen
symbolic links
, können Sie sie ändern in:Was jetzt für meine gibt
/usr/bin
:(Ein fehlerhafter Symlink ist ein Symlink zu einer Datei, für die
find
der Typ nicht bestimmt werden kann, weil die Datei nicht vorhanden ist oder sich in einem Verzeichnis befindet, auf das Sie keinen Zugriff haben, oder weil die Auflösung des Dateipfads eine Schleife aufweist In meinem Fall sind diese 2 Symlinks zu Dateien, die jetzt weg sind.Keiner von denen zählt
.
und..
. Wenn Sie möchten, dass sie aufgenommen werden (warum sollten Sie dasfind
tun ?), Gibt es keine andere Möglichkeit, als anzunehmen, dass sie für jedes Verzeichnis vorhanden sind, und sie systematisch zu zählen:Was dann auf meinem gibt
/usr/bin
:Wenn Sie keinen Zugriff auf die GNU haben
find
, können Sie die erste wie folgt umschreiben:Genau genommen haben wir jetzt keine Dateien gezählt, sondern Verzeichniseinträge . Ein Verzeichnis wie dieses enthält
/usr/bin
normalerweise mehrere Einträge, die auf dieselbe Datei verweisen. Zum Beispiel habe ich hier:Dies sind 3 Verzeichniseinträge (auch bekannt als Dateinamen oder Hardlinks) zu derselben Datei (der mit Inode 672252). Zum Zählen von Dateien anstelle von Verzeichniseinträgen und mit GNU
find
und GNUuniq
(Ignorieren.
und..
Dateien, die ohnehin Hardlinks zu anderen Verzeichnissen sind):Auf meiner
/usr/bin
gibt das:quelle
Sie haben nicht gesagt, ob Sie die gesamte Datei unter / usr / bin rekursiv oder nur unter der ersten Ebene haben möchten. Wie kommen Sie zu den Wörtern, die Sie zählen? Der übliche Weg, dies herauszufinden, besteht darin, find in wc auszuführen. So: find / usr / bin | wc -l Find listet dort alles auf, Verzeichnisse und Dateien. Wc -l zählt alle Zeilen in der Suchausgabe. Ist das eine Klassenaufgabe? Es ist in Ordnung, wenn es so ist, aber ich habe mich gefragt, warum Sie diese Informationen benötigen, damit ich die Antwort genauer anpassen kann. Bitte lassen Sie mich wissen, wenn Sie mehr benötigen. Costa
quelle
In Bash, ohne externe Werkzeuge.
In Bash, ohne externe Tools und Rekursion.
quelle
.
noch..
Einträge. Möglicherweise möchten Sie die Datei von der regulären Datei unterscheiden.