Каждый каталог в системе Unix (и, вероятно, в любой другой системе) содержит как минимум две записи каталога. Это .
(текущий каталог) и ..
(родительский каталог). В случае корневого каталога они указывают на то же место, но с любым другим каталогом они отличаются. Вы можете убедиться в этом сами, используя команды stat
, pwd
and cd
(в 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
/
$
Обратите внимание, bin
и у sbin
каждого есть две ссылки на него. Одна - это запись в корневом каталоге, а другая - .
запись в этом каталоге.
Использование ls
с конвейером в wc -l
- это простой трюк для подсчета количества строк в выводе ls. Предполагается, что каждый файл или каталог будет занимать ровно одну строку в выводе. GNU ls будет, когда вывод не является терминалом, делать это автоматически; другим может понадобиться -1
опция явного включения поведения. wc -l
просто считает и выводит количество строк ( -l
) на своем входе.
Проблема этого подхода заключается в том, что в Linux и в файловых системах, традиционно используемых в Linux, имена файлов и каталогов (в этом отношении они на самом деле одинаковы) могут содержать символы новой строки . При наличии таковых любой из методов разваливается - эти записи будут считаться двумя или более записями, когда в действительности они равны.
Пока вы используете GNU ls, не имеете записей каталогов с именами, содержащими символы новой строки, и не имеете нечетных псевдонимов для ls
(например, ls -a
), оба будут выводить количество файлов и каталогов в текущем (или указанном) каталоге. Для большинства людей это достаточно хорошо, но в общем случае оно недопустимо .
Если вам нужно правильно обрабатывать необычные символы (в первую очередь, новые строки) в именах записей каталога, я предлагаю использовать -b
опцию ls, чтобы избежать их. ls -1bA
будет печатать каждое имя записи каталога в отдельной строке, экранируя необычные символы (поэтому каждая запись каталога будет рассматриваться как единое целое), включая любые файлы точек и -директории. Выберите wc -l
полную командную строку, в ls -1bA | wc -l
которой будет указано количество файлов и каталогов в текущем каталоге (но игнорируйте .
и ..
; в этом разница между -a
и -A
), но не переходите ни в какие подкаталоги. Если вы не хотите, чтобы какие-либо точечные файлы были засчитаны в общую сумму, просто опустите -A
параметр до ls
.