Pergunta simples, mas não sei ao certo onde procurar e o Google não responde a períodos e barras.
Só estou tentando contar o número de arquivos e diretórios no diretório atual (não incluindo subpastas / arquivos) e estava tentando diferenciar ls -1 | wc -l
e, ls | wc -l
uma vez que eles parecem idênticos. Um site que eu estava vendo dizia "Lembre-se de que isso também conta os diretórios ./ e ../". em relação àquele com ls -1
, e não tenho certeza se isso significa que ele inclui os diretórios antes ou algo assim (o que eu não quero), mas não pareceu fazer isso nos testes.
Alguém poderia confirmar qual seria o mais adequado para contar o número de arquivos e diretórios apenas no diretório atual (não sub) e o que eles significam com diretórios ./ e ../?
Respostas:
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 comandosstat
,pwd
ecd
(no Linux):Observe que
bin
esbin
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 parawc -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 exemplols -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. Escolhawc -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 parals
.fonte
-a
e-A
incluem arquivos ocultos, o que eu percebi que quero evitar, então, no máximo, eu farials -b | wc -l
, mas isso me dá a resposta certa. A linha que copio e colei em relação a este comando está incorreta? Se estivesse correto, eu não deveria estar obtendo uma saída 8 quando houver 6 arquivos ou pastas em um diretório?mkdir()
chamada do sistema. Nem todos os sistemas de arquivos os possuem e nem são necessários nem exigidos pelo POSIX.Para responder à pergunta no assunto:
Quando um diretório B é criado no Unix, ele é adicionado como uma nova entrada em outro diretório A (seu diretório pai) e, em B, duas entradas são adicionadas: uma chamada
.
como um link físico para si mesma e uma chamada..
como um disco rígido. link para A.Esses são os únicos links físicos para diretórios permitidos (embora algumas versões mais antigas de alguns Unices também permitam links arbitrários).
é por isso que na maioria dos sistemas de arquivos (
btrfs
sendo uma exceção notável), o númerolinks
de um diretório é uma indicação de quantos subdiretórios ele possui (contabilizando suas..
entradas).Quando você está renomeando / movendo um diretório, se for para o mesmo diretório (com um nome diferente), apenas a entrada de nome
A
é alterada. B.
e..
não é afetado. Mas se você o mover, faça um diretório diferente, então o..
inB
será alterado. Isso explica por que você pode renomear um diretório no qual você não tem acesso de gravação (supondo que você tenha acesso de gravação ao diretório pai) apenas desde que não o mova para outro diretório (caso contrário, a necessidade de alterar a..
entrada impede você de movê-lo).Cuidado, porém:
/a/b/../c
pode não ser o mesmo,/a/c
porque/a/b
pode ser um link simbólico para outro diretório.Uma exceção é quando esse caminho é dado ao
cd
comando para alguns shells. Elescd
tratam..
logicamente ignorar as..
entradas nos diretórios. Um motivo pelo qual você vê frequentementecd -P
em scripts escritos corretamente, para desativar esse recurso que poderia causar confusão e inconsistências.Para contar o número de entradas no diretório atual, excluindo
.
e..
combash
, você pode:Com zsh:
Portably:
fonte
ls | wc -l
é a única exclusão.
e..
ls
não lista arquivos ocultos. Você precisals -A
obter o mesmo que esses. Se você não quiser contar os arquivos ocultos, retire odotglob
(para bash) ouD
(para zsh) ou adicione um! -name '.*'
antes-print
parafind
.ls | wc -l
ainda me dá a resposta certa e exclui arquivos ocultos,.
&..
?.
,..
e outro arquivo cujo começa nome com.
o qual não está listado por ls mas seria porls -A
. Portantols | wc -l
, não fornece a resposta correta, porque não está contando esse arquivo oculto..
e..
são arquivos ocultos, pois começam com a.
. Existe até uma lenda que explica que os dotfiles são ocultados por acidente, pois uma implementação inicial dels
era para excluir apenas.
e..
, mas houve um bug que fez com que ele excluísse qualquer arquivo começando com.
.ls | wc -l
não funciona se os nomes de arquivos contiverem caracteres de nova linha.Eu não sou um grande especialista em Linux, mas conheço o Linux (costumava ser administrador há 16 anos, no Slackware :) bons velhos tempos
os diretórios ./ e ../ é simples:. é o diretório atual, .. é o diretório anterior (na árvore de pwd -local directory command-
Se contar, acho que eles adicionam 2 ao total da listagem, na verdade não vão recursivamente e contam o diretório abaixo do atual e também contam novamente o diretório atual (.) :))
Então, basicamente, acho que agrega o valor 2 para já contar (arquivos) no diretório atual.
Alguém me corrija se eu estiver errado.
Estou apenas postando para ajudar e, visto que ninguém respondeu a essa pergunta aqui, eles podem estar ocupados. Mas experimente e veja se você tem 10 arquivos e conte 12, então é isso.
fonte
ls | wc -1
ls | wc -l
inclui.
e..
quando obtenho a resposta certa, em oposição à resposta correta. + #