Każdy katalog w systemie Unix (i prawdopodobnie także każdy inny system) zawiera co najmniej dwie pozycje katalogu. Są to .
(katalog bieżący) i ..
(katalog macierzysty). W przypadku katalogu głównego wskazują one to samo miejsce, ale w każdym innym katalogu są one różne. Można to zobaczyć na własne oczy użyciu stat
, pwd
i cd
polecenia (w systemie Linux):
$ 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
/
$
Uwaga, bin
i sbin
każdy ma dwa linki do niego. Jeden to wpis katalogu w katalogu głównym, a drugi to .
wpis w tym katalogu.
Używanie ls
z potokiem do wc -l
jest prostą sztuczką, aby policzyć liczbę linii na wyjściu ls. Zakłada się, że każdy plik lub katalog zajmie dokładnie jeden wiersz na wyjściu. GNU ls zrobi to, gdy wyjście nie jest terminalem, zrobi to automatycznie; inni mogą potrzebować -1
opcji jawnego włączenia zachowania. wc -l
po prostu zlicza i wypisuje liczbę wierszy ( -l
) na wejściu.
Problem z tym podejściem polega na tym, że w systemie Linux i systemach plików tradycyjnie używanych w systemie Linux, nazwy plików i katalogów (w tym przypadku są one naprawdę takie same) mogą zawierać znaki nowej linii . W ich obecności jedna z metod się rozpada - wpisy te będą liczone jako dwa lub więcej wpisów, podczas gdy w rzeczywistości są one jednym.
Tak długo, jak używasz GNU ls, nie ma pozycji katalogu z nazwami zawierającymi znaki nowego wiersza i nie ma nieparzystych aliasów dla ls
(na przykład ls -a
), oba będą wyświetlać liczbę plików i katalogów w bieżącym (lub określonym) katalogu. Dla większości ludzi jest to wystarczająco dobre, ale nie jest to poprawne w ogólnym przypadku.
Jeśli potrzebujesz poprawnie obsługiwać nietypowe znaki (przede wszystkim znaki nowej linii) w nazwach pozycji katalogu, sugeruję użycie -b
opcji ls, aby je uciec. ls -1bA
wypisze nazwę każdego wpisu katalogu we własnym wierszu, unikając nietypowych znaków (więc każdy wpis katalogu będzie postrzegany jako jeden), w tym wszelkie pliki-kropkowe i -katalogi. Dołącz wc -l
do pełnego wiersza poleceń, ls -1bA | wc -l
który zgłosi liczbę plików i katalogów w bieżącym katalogu (ale zignoruj .
i ..
; to różnica między -a
i -A
), ale nie zejdzie do żadnych podkatalogów. Jeśli nie chcesz, aby pliki dot były liczone do sumy, po prostu pomiń -A
parametr do ls
.