Попробуйте ls | cat
, чтобы увидеть, как форматы ls выводят по-разному при передаче по конвейеру по сравнению с отправкой на терминал.
ls
дает вам 3 столбца, которые отличаются от одной строки, поэтому wc
считает новую строку после окончания каждого столбца. Другими словами, ls
выводит форматированный текст, даже если вы этого не видите. Но wc
есть.
ls
, при выводе на что-либо, кроме терминала, ведет себя как ls -1
(, это цифра 1
, а не «ell» ), и выводит каждое имя на новой строке.
Если вы хотите подсчитать количество строк в выводе ls
так, как оно выглядело бы, если бы оно вообще не было передано по конвейеру, используйте ls -C
. Параметр -C
для ls
принудительно выводит несколько столбцов -независимо от того, куда направлен этот вывод.
То есть использовать
ls -C | wc
или, чтобы просто получить количество строк,
ls -C | wc -l
С другой стороны, если бы вы хотели посчитать количество строк в трех файлах по отдельности, вы бы использовали
wc -l -- *
Если бы каждый файл содержал ровно одну строку, это привело бы к выводу
1 1.txt
1 2.txt
1 3.txt
3 total
То есть каждый файл содержит одну строку, а общее количество строк в трех файлах равно трем.
Разница между wc -l -- *
иls -C | wc -l
(или ls | wc
, как вы написали ), заключается в том, откуда wc
получает входные данные.
С помощью ls -C | wc -l
wc
считывает из выводls
и, следовательно, подсчитывает количество строк, созданных командой ls
. Не количество строк в любом файле.
С помощью wc -l -- *
мы говорим wc
читать определенные файлы . В этом случае файлы, соответствующие именам, до которых расширяется подстановочный знак («шаблон подстановки имен файлов» )*
.
wc -l -- *
эквивалентно wc -l -- 1.txt 2.txt 3.txt
, если это единственные файлы в каталоге.
Обратите внимание, что если один из файлов в текущем каталоге называется -
, это не будет работать должным образом, так как wc
интерпретирует аргумент -
как означающий стандартный ввод . Один из способов обойти это — использовать wc -l./*
вместо(./-
не специально для wc
), но это означает, что префикс ./
также будет отображаться в выводе wc
.