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.