Считать в справочнике
Я хотел бы знать, в чем разница между:
$ ls | wc -l
а также
$ ls > foo
$ wc -l < foo
при подсчете всех файлов в текущих каталогах. И почему второй дает мне еще один файл.
2 ответа
На самом деле нет никакой разницы. Второй случай также будет включать файл 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