Считать в справочнике

Я хотел бы знать, в чем разница между:

$ 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

Другие вопросы по тегам