Por que ls | wc produz 3 linhas em dir com 3 arquivos de uma linha? [fechadas]

-1
$ 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'.

    
por Alexandr 19.11.2018 / 12:19

3 respostas

4

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.

    
por 19.11.2018 / 12:31
3

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 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 .

    
por 19.11.2018 / 13:50
1

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.

    
por 19.11.2018 / 12:34

Tags