Каждый каталог в системе Unix (и, вероятно, в любой другой системе) содержит как минимум две записи каталога. Это .(текущий каталог) и ..(родительский каталог). В случае корневого каталога они указывают на то же место, но с любым другим каталогом они отличаются. Вы можете убедиться в этом сами, используя команды stat, pwdand 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.