Uma abordagem seria usar ls
para nos fornecer uma lista dos arquivos, mas queremos que essa lista mostre apenas 1 arquivo ou diretório por linha. A opção -1
fará isso por nós.
$ ls -1
dir1
dir2
dir3
fileA
fileB
fileC
Exemplo
Crie os dados de amostra acima em um diretório vazio.
$ mkdir dir{1..3}
$ touch file{A..C}
Verifique:
$ ls
dir1 dir2 dir3 fileA fileB fileC
Agora, para contar, você pode usar wc -l
para contar o número de linhas, que correspondem a um arquivo ou diretório na ls -1
output.
$ ls -1 | wc -l
6
(note que não inclui os arquivos ocultos)
Contando arquivos ou diretórios, apenas não juntos
Para contar arquivos ou diretórios, você precisa alterar um pouco a sua tática. Nesse caso, usaria ls -l
, já que mostra o que é um diretório e o que é um arquivo.
Exemplo
$ ls -l
total 12
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir1
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir2
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir3
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileA
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileB
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileC
Em seguida, podemos usar grep
para filtrar diretórios ou não diretórios da seguinte forma:
# directories
$ ls -l | grep "^d"
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir1
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir2
drwxrwxr-x 2 saml saml 4096 Nov 16 09:48 dir3
# regular files
$ ls -l | grep "^-"
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileA
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileB
-rw-rw-r-- 1 saml saml 0 Nov 16 09:49 fileC
Agora é só usar wc -l
para contar o acima:
# directories
$ ls -l | grep "^d" | wc -l
3
# regular files
$ ls -l | grep "^-" | wc -l
3
No entanto, você pode evitar wc
completamente e usar a opção grep
de -c
:
$ ls -l | grep -c '^d'
(mais uma vez, arquivos ocultos não são incluídos. Note que diretórios e regulares são dois tipos de arquivos. Existem muitos mais como pipes nomeados, links simbólicos, dispositivos, sockets ...).
Recursão
Se você precisar encontrar os arquivos e diretórios de forma recursiva em /usr/bin
, provavelmente desejará alterar completamente as táticas e usar outra ferramenta chamada find
.
Exemplo
$ find /usr/bin | wc -l
4632
(embora acima de /usr/bin
esteja incluído na contagem)
As mesmas técnicas que usei acima podem ser empregadas use ls
para fazer algo semelhante, mas ls
geralmente não é uma boa ferramenta para analisar a saída. find
, por outro lado, foi criado para isso e oferece opções para localizar arquivos ou diretórios.
# find files
$ find /usr/bin -type f
# find directories
$ find /usr/bin -type d
(observe que, desta vez, find
está incluindo arquivos ocultos (exceto .
e ..
)).
novas linhas?
Eu nunca descobri por que um caractere de nova linha é um caractere legal a ser usado na criação de nomes de arquivos ou de diretórios. Portanto, os métodos discutidos acima usando wc
e ls
não seriam compatíveis com eles, portanto, use-os com isso em mente.
Exemplo
Crie um diretório & nome do arquivo com novas linhas.
$ mkdir $'dir4\n5'
$ touch $'fileD\nE'
ls
mostra-os corretamente:
$ ls -1
dir1
dir2
dir3
dir4?5
fileA
fileB
fileC
fileD?E
Mas wc
conta os diretórios e arquivos que contêm novas linhas como 2 itens, não um.
$ ls -1 | wc -l
10
Um método para contornar isso, se usar a implementação GNU de find
é usar a capacidade de find
de imprimir outra coisa no lugar de cada arquivo que encontrar e, em seguida, contá-los.
Exemplo
$ find . -printf . | wc -c
9
Aqui encontramos tudo no diretório atual (exceto ..
), e imprimimos um ponto ( .
) para cada um e depois contamos os pontos usando a capacidade de wc
de contar bytes em vez de linhas wc -c
.