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, pwdund 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 binund sbinjeder hat zwei Links dazu. Einer ist der Verzeichniseintrag im Stammverzeichnis und der andere ist der .Eintrag in diesem Verzeichnis.
Die Verwendung lsmit einer Pipe to wc -list 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 -1Option, um das Verhalten explizit zu aktivieren. wc -lZä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 -bOption ls zu verwenden , um sie zu maskieren . ls -1bAGibt 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 -lum eine vollständige Befehlszeile zu erhalten, ls -1bA | wc -ldie die Anzahl der Dateien und Verzeichnisse im aktuellen Verzeichnis angibt (aber ignorieren Sie .und ..; das ist der Unterschied zwischen -aund -A), aber nicht in Unterverzeichnisse absteigend. Wenn Sie nicht möchten, dass Dotfiles zur Gesamtsumme gezählt werden, lassen Sie den -AParameter einfach weg ls.