Wie kann ich den Wortzähler (wc
) und Rohrleitungen, um zu zählen, wie viele Dateien oder Verzeichnisse sich in /usr/bin
befinden Verzeichnis?
Akzeptierte Antwort:
Ein Ansatz wäre die Verwendung von ls
um 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
switch erledigt das für uns.
$ ls -1
dir1
dir2
dir3
fileA
fileB
fileC
Beispiel
Erstellen Sie die obigen Beispieldaten in einem leeren Verzeichnis.
$ mkdir dir{1..3}
$ touch file{A..C}
Überprüfen Sie es:
$ ls
dir1 dir2 dir3 fileA fileB fileC
Jetzt können Sie zum Zählen wc -l
verwenden um die Anzahl der Zeilen zu zählen, die einer Datei oder einem Verzeichnis im ls -1
entsprechen Ausgabe.
$ ls -1 | wc -l
6
(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 ls -l
verwenden da es zeigt, was ein Verzeichnis und was eine Datei ist.
Beispiel
$ ls -l
total 12
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir1
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir2
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir3
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileA
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileB
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileC
Dann können wir grep
verwenden um Verzeichnisse oder Nicht-Verzeichnisse herauszufiltern:
# directories
$ ls -l | grep "^d"
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir1
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir2
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir3
# regular files
$ ls -l | grep "^-"
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileA
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileB
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileC
Verwenden Sie jetzt einfach wc -l
nochmal um das obige zu zählen:
# directories
$ ls -l | grep "^d" | wc -l
3
# regular files
$ ls -l | grep "^-" | wc -l
3
Sie können jedoch wc
vermeiden zusammen und verwenden Sie grep
's -c
Möglichkeit:
$ ls -l | grep -c '^d'
(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 benannte Pipes, symbolische Links, Geräte, Sockets …).
Rekursion
Wenn Sie die Dateien und Verzeichnisse rekursiv unter /usr/bin
finden müssen dann möchten Sie wahrscheinlich Ihre Taktik komplett ändern und ein anderes Tool namens find
verwenden .
Beispiel
$ find /usr/bin | wc -l
4632
(obwohl über /usr/bin
selbst wird mitgezählt)
Die gleichen Techniken, die ich oben verwendet habe, könnten mit ls
verwendet werden um etwas Ähnliches zu tun, aber ls
ist im Allgemeinen kein gutes Werkzeug, um die Ausgabe zu analysieren. find
andererseits wurde dafür gebaut und bietet Schalter, um entweder Dateien oder Verzeichnisse zu finden.
# find files
$ find /usr/bin -type f
# find directories
$ find /usr/bin -type d
(Beachten Sie, dass diesmal find
enthält versteckte Dateien (außer .
und ..
)).
Zeilenumbrüche?
Ich habe nie herausgefunden, warum ein Zeilenumbruchzeichen ein zulässiges Zeichen ist, das beim Erstellen von Dateinamen oder Verzeichnisnamen verwendet werden kann. Also die oben besprochenen Methoden mit wc
und ls
würde mit diesen nicht kämpfen, also verwenden Sie sie in diesem Sinne.
Beispiel
Erstellen Sie einen Verzeichnis- und Dateinamen mit Zeilenumbrüchen.
$ mkdir $'dir4n5'
$ touch $'fileDnE'
ls
zeigt sie richtig an:
$ ls -1
dir1
dir2
dir3
dir4?5
fileA
fileB
fileC
fileD?E
Aber wc
zählt die Verzeichnisse und Dateien, die Zeilenumbrüche enthalten, als 2 Elemente, nicht als eins.
$ ls -1 | wc -l
10
Eine Methode, dies zu umgehen, ist die Verwendung der GNU-Implementierung von find
ist die Verwendung von find
die Fähigkeit, anstelle jeder gefundenen Datei etwas anderes zu drucken und diese dann stattdessen zu zählen.
Beispiel
$ find . -printf . | wc -c
9
Hier finden wir alles im aktuellen Verzeichnis (außer ..
) und einen Punkt drucken (.
) für jeden und zähle dann die Punkte mit wc
’s Fähigkeit, Bytes statt Zeilen zu zählen, wc -c
.
Referenzen
- bash – Was ist der beste Weg, um Suchergebnisse zu zählen?