Não há diferença, na verdade. O segundo caso também inclui o arquivo foo
na lista e, portanto, fornece uma contagem de mais 1.
Gostaria de saber qual é a diferença entre:
$ ls | wc -l
e
$ ls > foo
$ wc -l < foo
ao contar todos os arquivos nas diretórios atuais. E por que o segundo me dá um arquivo a mais?
Não há diferença, na verdade. O segundo caso também inclui o arquivo foo
na lista e, portanto, fornece uma contagem de mais 1.
O que você está fazendo com ls > foo
está redirecionando a saída de ls para um arquivo. Surpreendentemente, o arquivo está sendo criado primeiro e incluído na saída de ls
abcd:$ ls
a?b file name
abcd:$ ls > file
abcd:$ cat file
a
b
file
file name
Antes do redirecionamento, havia dois arquivos a\nb
e file name
. Após o redirecionamento: 3 arquivos, file
incluídos. Este é o problema real no seu caso.
Mas você provavelmente notou outra coisa: por que o arquivo a\nb
foi listado em duas linhas. Por quê ? ls
pode listar arquivos, mas o shell permite quase qualquer tipo de caractere no nome do arquivo, incluindo a nova linha. Assim, quando a saída de ls é analisada, pode haver informações erradas. Para a contagem adequada de arquivos, que é o seu objetivo principal, você pode usar for
loop com shell glob
abcd:$ for FILE in * ; do echo "1";done
1
1
1
Como você pode ver, mostra corretamente que eu tenho 3 arquivos (incluindo o file
redirecionado de antes)
Para mais informações, consulte o link