Todo diretório em um sistema Unix (e provavelmente todos os outros sistemas também) contém pelo menos duas entradas de diretório. Estes são .
(diretório atual) e ..
(diretório pai). No caso do diretório raiz, eles apontam para o mesmo local, mas com qualquer outro diretório, eles são diferentes. Você pode ver isso usando os comandos stat
, pwd
e cd
(no Linux):
$ cd /
$ stat . .. bin sbin | grep Inode
Device: 802h/2050d Inode: 2 Links: 27
Device: 802h/2050d Inode: 2 Links: 27
Device: 802h/2050d Inode: 548865 Links: 2
Device: 802h/2050d Inode: 2670593 Links: 2
$ pwd
/
$ cd ..
$ pwd
/
$
Observe que bin
e sbin
cada um tem dois links para ele. Uma é a entrada de diretório no diretório raiz e a outra é a .
entrada dentro desse diretório.
Usar ls
um pipe para wc -l
é um truque simples para contar o número de linhas na saída de ls. A suposição é que cada arquivo ou diretório ocupará exatamente uma linha na saída. O GNU ls, quando a saída é não terminal, faz isso automaticamente; outros podem precisar da -1
opção de ativar o comportamento explicitamente. wc -l
simplesmente conta e gera o número de linhas ( -l
) em sua entrada.
O problema dessa abordagem é que, no Linux e nos sistemas de arquivos tradicionalmente usados no Linux, os nomes de arquivos e diretórios (eles são realmente o mesmo nesse aspecto) podem conter caracteres de nova linha . Na presença deles, qualquer um dos métodos se desfaz - essas entradas serão contadas como duas ou mais entradas quando, na realidade, forem uma.
Desde que você esteja usando o GNU ls, não tenha entradas de diretório com nomes que contenham caracteres de nova linha e não possua aliases ímpares para ls
(por exemplo ls -a
), ambos produzirão a contagem de arquivos e diretórios no diretório atual (ou especificado). Para a maioria das pessoas, isso é bom o suficiente, mas não é válido no caso geral .
Se você precisar manipular caracteres incomuns (principalmente novas linhas) nos nomes de entrada de diretório corretamente, sugiro usar a -b
opção ls para escapar deles. ls -1bA
imprimirá cada nome de entrada do diretório em sua própria linha, escapará de caracteres incomuns (para que cada entrada do diretório seja vista como um), incluindo arquivos de ponto e diretórios -d. Escolha wc -l
uma linha de comando completa, ls -1bA | wc -l
que relate o número de arquivos e diretórios no diretório atual (mas ignore .
e ..
; essa é a diferença entre -a
e -A
), mas não desça em nenhum subdiretório. Se você não deseja que nenhum arquivo de ponto seja contado no total, simplesmente omita o -A
parâmetro para ls
.