Contando arquivos, diretórios, etc. em determinado diretório e formatando a saída na tela

1

Acabei de começar uma aula de script e poderia usar alguma ajuda. Eu estou escrevendo um script para inspecionar os nomes de arquivo de cada arquivo e diretório em um determinado diretório e acumular uma contagem de cada arquivo, subdiretório, symlink, arquivos antigos, arquivos gráficos, arquivos tmp, arquivos exe e contagem total de bytes de cada arquivo dentro desse diretório.

A saída precisa ser formatada desta maneira:

  • Diretórios n, nnn, nnn
  • Arquivos n, nnn, nnn
  • etc ...

Quando executo meu script, não parece contar nada porque todos os itens de contagem retornam 0. Também estou tendo problemas com a formatação dos números para ter vírgula. $ 1 é o diretório que o usuário digitará para pesquisar quando executar o script, por exemplo: ./srpt / etc. Para executar a pesquisa, estou usando o comando find com printf para formatar a saída e canalizar a saída para wc para contar o número de linhas. Eu suponho que isso me daria o número de arquivos que recebem os nomes dos arquivos são apenas uma linha. Há provavelmente um bilhão de maneiras de fazer isso e, desta forma, pode não ser o mais elegante, mas eu apreciaria a contribuição de qualquer um.

if [ -d "$1" ]; then
        directories=$(find "$1" -type d -printf "%'d" | wc -l)
        files=$(find "$1" -type f -printf "%'d" | wc -l)
        sym=$(find "$1" -type l -printf "%'d" | wc -l)

etc ...

#Printing the output to the terminal
      echo "Directories" $directories
      echo "Files" $files
      echo "Sym links" $sym
      exit 0
else
        echo "[ERROR]: need path to perform search"
        exit 1
fi

Minha saída:

Directories 0
Files 0
Sym Links 0
    
por Sharrison 07.09.2017 / 00:05

2 respostas

1

É necessário alterar seus comandos para este formulário:

directories=$(printf "%'d\n" $(find "$1" -type f | wc -l))

printf usa o separador de milhares para sua localidade atual, que pode ser uma vírgula, ponto ou nada. Você pode alterar o código de idioma se quiser forçar vírgulas.

Além disso, você pode fazer isso da seguinte maneira:

if [ -d "$1" ]; then
    directories=$(find "$1" -type d | wc -l)
    files=$(find "$1" -type f | wc -l)
    sym=$(find "$1" -type l | wc -l)

e substitua echo para printf

#Printing the output to the terminal

  printf "%s %'d\n" "Directories" $directories
  printf "%s %'d\n" "Files" $files
  printf "%s %'d\n" "Sym links" $sym

O erro aconteceu, porque você misturou dois comandos diferentes - os printf do bash e -printf do find.

O formato -printf the "%'d" da localização está incorreto. A cotação singular não é permitida e %d é a profundidade do arquivo na árvore de diretórios. Você pode encontrar todas as opções -printf no man find , digitando: /printf format .

A propósito, foi necessário adicionar \n a printf (bash's e find's): "%d\n" , caso contrário, eles imprimirão todas as saídas em uma linha.

    
por 07.09.2017 / 00:29
1

-printf "%'d" não faz nada lá, então as contagens estão resultando em 0, você precisa alterá-lo com -printf "%p\n" .

    
por 07.09.2017 / 00:29