Auf Unix-Systemen ist es normalerweise so , dass die Anzahl der Links zu einem Verzeichnis der Anzahl der Unterverzeichnisse plus 2 entspricht. Es gibt jedoch Fälle, in denen dies nicht zutrifft:
Einige Unices erlauben feste Links zu Verzeichnissen. Dann gibt es mehr als 2 Links, die nicht den Unterverzeichnissen entsprechen.
Es gibt Dateisysteme, in denen Verzeichnisse keine Einträge für .
und haben ..
. Das GNU-Suchhandbuch erwähnt einige Beispiele in der Diskussion seiner -noleaf
Option (die eine Optimierung deaktiviert, die dies voraussetzt .
und ..
in allen Verzeichnissen vorhanden ist): "CD-ROM- oder MS-DOS-Dateisysteme oder AFS-Volume-Mount-Punkte"
Eine fast zuverlässige Methode zum Zählen der Anzahl der Unterverzeichnisse (es kann immer noch fehlschlagen, wenn ein Dateiname ein Zeilenumbruchzeichen enthält) ist
$(($(LC_ALL=C ls -la /path/to/directory | grep '^d' | wc -l) - 2)
Ein zuverlässigerer Weg verwendet Shell Globs */
und .*/
; Wie üblich ist der Umgang mit dem Fall, in dem das Muster nicht übereinstimmt, etwas schmerzhaft (außer in Bash und Zsh, wo Sie die nullglob
Option aktivieren können ).
Gilles 'SO - hör auf böse zu sein'
quelle
-type d
, aber: 1. dies erfordert GNU-Fund; 2. Sie müssen 1 für das Startverzeichnis (oder den Pass-mindepth 1
) subtrahieren .Verwenden Sie nicht
ls
für diese . Hier ist eine Möglichkeit, die mit allen Dateinamen funktioniert , auch mit solchen, die Zeilenumbrüche enthalten, da anstelle des Dateinamens nur ein Zeilenumbruchzeichen gedruckt wird:Bearbeiten: Die aktuelle Version führt zu keinen Warnungen, da
-mindepth
und-maxdepth
sollte vorher sein-type
(der Verzeichnisbaum wird vor dem Suchen nach Verzeichnissen gelöscht, um Zeit zu sparen).quelle