user4556274 уже ответил, почему. Мой ответ служит только для предоставления дополнительной информации о том, как правильно подсчитывать файлы.
В сообществе Unix общий консенсус заключается в том, что синтаксический анализ вывода ls - очень плохая идея, поскольку имена файлов могут содержать контроль символов или скрытых символов. Например, из-за символа новой строки в имени файла мы ls | wc -l сообщают, что на выходе ls (что у него есть) есть 5 строк, но на самом деле в каталоге есть только 4 файла. [!d3 ]
$> touch FILE$'\n'NAME
$> ls
file1.txt file2.txt file3.txt FILE?NAME
$> ls | wc -l
5
Команда find, которая обычно используется для работы с парсингом имен файлов, может помочь нам здесь, напечатав номер inode. Будь то каталог или файл, он имеет только один уникальный номер inode. Таким образом, используя -printf "%i\n" и исключая . через -not -name ".", мы можем иметь точный подсчет файлов. (Обратите внимание на использование -maxdepth 1, чтобы предотвратить рекурсивное спуск в подкаталоги)
$> find -maxdepth 1 -not -name "." -print
./file2.txt
./file1.txt
./FILE?NAME
./file3.txt
$> find -maxdepth 1 -not -name "." -printf "%i\n" | wc -l
4
То же самое можно использовать с stat для подсчета номеров индексных номеров в строке:
$> LC_ALL=C stat ./* --printf "%i\n" | wc -l
4
Альтернативный подход заключается в использовании шаблона. (Обратите внимание, что в этом тесте используется другой каталог для проверки того, сходит ли этот подход в подкаталоги, чего нет - 16 - это проверенное количество элементов в моем ~/bin)
$> count=0; for item in ~/bin/* ; do count=$(($count+1)) ; echo $count ; done | tail -n 1
16
Python также может работать с проблемными именами файлов путем печати длины списка с учетом моей функции os.listdir() (которая не является рекурсивной и будет перечислять только элементы в каталоге, указанном как аргумент).
$> python -c "import os ; print os.listdir('.')"
['file2.txt', 'file1.txt', 'FILE\nNAME', 'file3.txt']
$> python -c "import os ; print(len(os.listdir('.')))"
4