Experimente ls | cat
para ver como os formatos ls são emitidos de forma diferente quando canalizados, em comparação com quando enviados para o terminal.
$ ls
1.txt 2.txt 3.txt
$ ls | wc
3 3 18
Todos os três arquivos tem apenas uma linha, mas ls | wc produz '3'.
Experimente ls | cat
para ver como os formatos ls são emitidos de forma diferente quando canalizados, em comparação com quando enviados para o terminal.
ls
, ao enviar para algo diferente de um terminal, se comporta como ls -1
(esse é o dígito 1
, não "ell") e gera cada nome em uma nova linha.
Se você quiser contar o número de linhas na saída ls
como teria aparecido se não tivesse sido canalizada, use ls -C
. A opção -C
para ls
força a saída em várias colunas, independentemente de onde essa saída é direcionada.
Ou seja, use
ls -C | wc
ou, para obter apenas a contagem de linhas,
ls -C | wc -l
Por outro lado, se você quisesse contar o número de linhas nos três arquivos, individualmente, você teria usado
wc -l -- *
Isto, se cada arquivo continha exatamente uma linha, resultaria na saída
1 1.txt
1 2.txt
1 3.txt
3 total
Ou seja, cada arquivo contém uma linha e o número total de linhas nos três arquivos é três.
A diferença entre wc -l -- *
e ls -C | wc -l
(ou ls | wc
como você escreveu) é de onde wc
obtém sua entrada.
Com ls -C | wc -l
, wc
lê a saída de ls
e, portanto, conta o número de linhas que o comando ls
produziu. Não é o número de linhas em qualquer arquivo.
Com wc -l -- *
, informamos wc
para ler arquivos específicos . Nesse caso, os arquivos correspondentes aos nomes que o caractere curinga ("padrão de globalização de nome de arquivo") *
expande para.
wc -l -- *
é equivalente a wc -l -- 1.txt 2.txt 3.txt
se esses forem os únicos arquivos no diretório.
Observe que, se um dos arquivos no diretório atual for chamado -
, isso não funcionará corretamente, pois wc
interpreta um argumento -
como significando entrada padrão . Uma maneira de contornar isso seria usar wc -l ./*
( ./-
não é especial para wc
), mas isso significa que ./
prefixo também será exibido na saída de wc
.
ls
está dando a você 3 colunas que são diferentes da linha única, portanto wc
está contando uma nova linha após o final de cada coluna. Em outras palavras, ls
produz texto formatado, mesmo que você não veja isso. Mas wc
faz.