Почему ls | wc выводит 3 строки в каталоге с 3 однострочными файлами? [закрыто]

-1
19.11.2018, 13:29
3 ответа

Попробуйте ls | cat, чтобы увидеть, как форматы ls выводят по-разному при передаче по конвейеру по сравнению с отправкой на терминал.

5
28.01.2020, 05:06

lsдает вам 3 столбца, которые отличаются от одной строки, поэтому wcсчитает новую строку после окончания каждого столбца. Другими словами, lsвыводит форматированный текст, даже если вы этого не видите. Но wcесть.

1
28.01.2020, 05:06

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 -lwcсчитывает из выводlsи, следовательно, подсчитывает количество строк, созданных командой ls. Не количество строк в любом файле.

С помощью wc -l -- *мы говорим wcчитать определенные файлы . В этом случае файлы, соответствующие именам, до которых расширяется подстановочный знак («шаблон подстановки имен файлов» )*.

wc -l -- *эквивалентно wc -l -- 1.txt 2.txt 3.txt, если это единственные файлы в каталоге.

Обратите внимание, что если один из файлов в текущем каталоге называется -, это не будет работать должным образом, так как wcинтерпретирует аргумент -как означающий стандартный ввод . Один из способов обойти это — использовать wc -l./*вместо(./-не специально для wc), но это означает, что префикс ./также будет отображаться в выводе wc.

3
28.01.2020, 05:06

Теги

Похожие вопросы