Я хотел бы знать то, между чем различие:
$ ls | wc -l
и
$ ls > foo
$ wc -l < foo
при подсчете всех файлов в текущих каталогах. И то, почему делает второй, дает мне один файл больше.
Нет никакого различия, действительно. Второй случай также включал бы файл foo
в список и поэтому дает Вам количество еще 1.
С чем Вы делаете ls > foo
перенаправляет вывод ls в файл. Удивительно достаточно файл создается сначала и включается в вывод ls
abcd:$ ls
a?b file name
abcd:$ ls > file
abcd:$ cat file
a
b
file
file name
Перед перенаправлением было два файла a\nb
и file name
. После перенаправления: 3 файла, file
включенный. Это - настоящая проблема в Вашем случае.
Но Вы, вероятно, заметили что-то еще: почему a\nb
файл был перечислен на двух строках. Почему? ls
может перечислить файлы, но оболочка позволяет почти любой тип символа в имени файла, включая новую строку. Таким образом, когда вывод ls анализируется, может быть ошибочная информация. Для надлежащего подсчета файлов, который является тем, что Ваша главная цель здесь, Вы могли использовать for
цикл с шариком оболочки
abcd:$ for FILE in * ; do echo "1";done
1
1
1
Поскольку Вы видите, что это правильно показывает, что у меня есть 3 файла (включая file
перенаправленный до)
Для большего количества информации обратитесь к http://www.dwheeler.com/essays/filenames-in-shell.html