Determinando o número de arquivos e subdiretórios no Linux

3

Ao exibir diretórios no Linux usando o ls -ld, recebo algo assim:

user@shell:~/somedirectory$ ls -ld 
drwxr-xr-x 2014 K-rock users 65536 20011-11-05 11:34
user@shell:~/somedirectory$

Como eu encontraria o número de subdiretórios e arquivos no somedirectory usando o resultado acima? Pelo que entendi, o número de links corresponde ao número de subdiretórios, mas e quanto ao número de arquivos? Como eu iria ler o resultado do ls -ld para encontrar esses números?

Além disso, esta é uma atribuição e eu tenho que dizer o número de arquivos e subdir que estão em algum diretório usando o resultado mostrado acima. Então, eu não posso usar nenhum outro código, infelizmente.

    
por k-Rocker 11.11.2014 / 21:19

4 respostas

3

Desde que você queira decifrar a saída que obteve, tentaremos simplificar as coisas.

ls -ld
drwxr-xr-x 4 root root 4096 Nov 11 14:29 .

Agora, ls -ld em um diretório me fornece a saída como acima. Agora, o número 4 é algo que você precisa se concentrar. O 4 corresponde a:

  • a entrada desse diretório em seu diretório pai;
  • a entrada do diretório para . ;
  • as entradas .. nos dois subdiretórios dentro do diretório.

Para verificar isso, se eu emitir apenas ls , poderei ver que tenho mais diretórios. Então, isso dá uma ideia do que poderíamos decifrar da saída do seu caso.

drwxr-xr-x 2014 K-rock users 65536 20011-11-05 11:34

Existem subdiretórios de 2012 dentro dos quais você obtém 2014 na saída.

Quanto ao número de arquivos, não é possível encontrá-lo a partir da saída que você possui.

Para testar se minha teoria está correta, fiz o teste abaixo.

ls -la | grep -E '[d]' #Display only directories
drwxr-xr-x 12 root root 4096 Nov 11 14:42 .
drwxr-xr-x  4 root root 4096 Nov 11 14:20 ..
drwxr-xr-x  3 root root 4096 Nov 11 14:45 hello1
drwxr-xr-x  2 root root 4096 Nov 11 14:42 hello2
drwxr-xr-x  2 root root 4096 Nov 11 14:42 hello3
drwxr-xr-x  2 root root 4096 Nov 11 14:42 hello4
drwxr-xr-x  2 root root 4096 Nov 11 14:42 hello5
drwxr-xr-x  2 root root 4096 Nov 11 14:42 hello6
drwxr-xr-x  2 root root 4096 Nov 11 14:42 hello7
drwxr-xr-x  2 root root 4096 Nov 11 14:42 hello8
drwxr-xr-x  2 root root 4096 Nov 11 14:21 hello-subdir
drwxr-xr-x  2 root root 4096 Nov 11 14:29 spaced hello

Agora, emito o comando ls -ld e a saída que recebo é

ls -ld
drwxr-xr-x 12 root root 4096 Nov 11 14:42 .

Ele não levou em consideração os arquivos ou subdiretórios aninhados dentro dos subdiretórios da pasta. Basicamente, o comando acima diz que eu tenho 10 diretórios dentro da minha pasta.

P.S .: Muitas vezes é uma má idéia analisar algo de ls output, pois não é confiável. Use find com -maxdepth se você tiver a chance de usá-lo.

    
por 11.11.2014 / 21:43
1

Se você puder usar ls , presumo que você também possa usar a funcionalidade bash incorporada.

Usando bash puro para contar todas as entradas no diretório atual:

$ num_entries () (       # Define a function to:
> shopt -s nullglob      # expand * to empty string if no files
> shopt -s dotglob       # include .files in * expansion
> a=( * )                # create array containing all entries in current directory
> echo ${#a[@]}          # display length of array (number of directory entries)
> )
$ num_entries            # call function for current directory
467
$ 

Usando bash puro para contar todos os subdiretórios no diretório atual:

$ num_dirs () (
> shopt -s nullglob
> shopt -s dotglob
> a=( */ )               # note the */ glob which selects only directories
> echo ${#a[@]}
> )

Eu coloquei estes em corpos de funções ( ) , então as configurações de shopt só teriam efeito dentro dessa função e não teriam outros efeitos colaterais.

    
por 11.11.2014 / 23:38
0

Em um caso simples, isso funciona:

ls -A1 | wc -l
    
por 11.11.2014 / 21:26
0

Você pode combinar algumas abordagens

  1. Número de arquivos em um diretório

    ls -l | grep "^-" | wc -l
    
  2. Percorrer subdiretórios

    find ./subdirectory -type d
    
  3. juntos em um comando

     find ./subdirectory -type d | xargs -I{} sh -c "ls -l {} | grep -c '^-'"
    

Irá recursivamente resultar em uma contagem de arquivos restistindo nos diretórios.

É claro que existem várias maneiras de aperfeiçoar ou enriquecer o resultado.

    
por 11.11.2014 / 21:34

Tags