GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie benutzt man WC und Piping, um herauszufinden, wie viele Dateien und Verzeichnisse sich in einem bestimmten Verzeichnis befinden?

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 .. )).

Verwandte Themen:Finden Sie die beste Schriftart zum Rendern eines Codepunkts?

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?

Linux
  1. So finden Sie die Anzahl der Dateien in einem Verzeichnis und Unterverzeichnissen

  2. So finden Sie eine Datei in Linux rekursiv in allen Verzeichnissen

  3. So finden und kopieren Sie bestimmte Dateitypen von einem Verzeichnis in ein anderes unter Linux

  4. Verwenden Sie Suchen, um ein bestimmtes Verzeichnis zu finden und alle darin enthaltenen Dateien außer einem Verzeichnis zu löschen?

  5. So finden und löschen Sie leere Verzeichnisse und Dateien in Unix

Find-Befehl in Linux (Dateien und Verzeichnisse suchen)

So benennen Sie Dateien und Verzeichnisse in Linux um

So komprimieren Sie Dateien und Verzeichnisse unter Linux

So kopieren Sie Dateien und Verzeichnisse unter Linux

So verwenden Sie sed zum Suchen und Ersetzen von Zeichenfolgen in Dateien

So verwenden Sie den cp-Befehl zum Kopieren von Dateien und Verzeichnissen