Jedes Verzeichnis auf einem Unix-System (und wahrscheinlich auch jedes andere System) enthält mindestens zwei Verzeichniseinträge. Dies sind .
(aktuelles Verzeichnis) und ..
(übergeordnetes Verzeichnis). Im Fall des Stammverzeichnisses verweisen diese auf dieselbe Stelle, bei allen anderen Verzeichnissen sind sie jedoch unterschiedlich. Sie können dies mit den Befehlen stat
, pwd
und cd
(unter Linux) überprüfen:
$ cd /
$ stat . .. bin sbin | grep Inode
Device: 802h/2050d Inode: 2 Links: 27
Device: 802h/2050d Inode: 2 Links: 27
Device: 802h/2050d Inode: 548865 Links: 2
Device: 802h/2050d Inode: 2670593 Links: 2
$ pwd
/
$ cd ..
$ pwd
/
$
Beachten Sie, dass bin
und sbin
jeder hat zwei Links dazu. Einer ist der Verzeichniseintrag im Stammverzeichnis und der andere ist der .
Eintrag in diesem Verzeichnis.
Die Verwendung ls
mit einer Pipe to wc -l
ist ein einfacher Trick, um die Anzahl der Zeilen in der Ausgabe von ls zu zählen. Die Annahme ist, dass jede Datei oder jedes Verzeichnis genau eine Zeile in der Ausgabe belegt. GNU ls wird dies automatisch tun, wenn der Ausgang kein Terminal ist. Andere benötigen möglicherweise die -1
Option, um das Verhalten explizit zu aktivieren. wc -l
Zählt einfach die Anzahl der Zeilen ( -l
) in seiner Eingabe und gibt sie aus .
Das Problem bei diesem Ansatz ist, dass in Linux und in den traditionell unter Linux verwendeten Dateisystemen Datei- und Verzeichnisnamen (in dieser Hinsicht sind sie wirklich identisch) Zeilenumbrüche enthalten dürfen . Bei Vorhandensein dieser Einträge fällt jede Methode auseinander - diese Einträge werden als zwei oder mehr Einträge gezählt, wenn sie in Wirklichkeit eins sind.
Solange Sie GNU ls verwenden, haben keine Verzeichniseinträge mit Namen Zeilenumbrüche enthalten, und haben keine ungeradeen Aliase für ls
(zum Beispiel ls -a
), werden beide Ausgänge die Anzahl der Dateien und Verzeichnisse im aktuellen (oder angegebenen) Verzeichnis. Für die meisten Menschen ist das gut genug, aber im allgemeinen Fall nicht gültig .
Wenn Sie ungewöhnliche Zeichen (hauptsächlich Zeilenumbrüche) in Verzeichniseintragsnamen richtig behandeln müssen, schlage ich vor, die -b
Option ls zu verwenden , um sie zu maskieren . ls -1bA
Gibt den Namen jedes Verzeichniseintrags in einer eigenen Zeile aus, wobei ungewöhnliche Zeichen (dh jeder Verzeichniseintrag wird als ein einziger angezeigt), einschließlich aller Punktdateien und -verzeichnisse, ausgeblendet werden. Wenden Sie sich an, wc -l
um eine vollständige Befehlszeile zu erhalten, ls -1bA | wc -l
die die Anzahl der Dateien und Verzeichnisse im aktuellen Verzeichnis angibt (aber ignorieren Sie .
und ..
; das ist der Unterschied zwischen -a
und -A
), aber nicht in Unterverzeichnisse absteigend. Wenn Sie nicht möchten, dass Dotfiles zur Gesamtsumme gezählt werden, lassen Sie den -A
Parameter einfach weg ls
.