Script Bash para contar tipos de arquivos em um caminho (incluindo subpastas)

2

Gostaria de obter uma visão geral rápida sobre os diferentes tipos de arquivo em um diretório (incluindo todos os seus subdiretórios) usando a ferramenta file , por exemplo. me dizendo qual tipo de arquivo é o mais comum lá.

Ele deve ser implementado como um shell script prático em linguagens shell comuns ou ferramentas de script como bash ou awk .

Possíveis bons para ter:

  • bom desempenho
  • lidando com qualquer nome ou tipo de arquivo
  • Compatibilidade POSIX

(últimos dois pontos são praticamente exclusivos)

    
por phk 25.05.2016 / 13:40

2 respostas

5

Use sort | uniq -c para contar linhas idênticas:

find "$path" -type f -exec file -b {} + | sort | uniq -c | sort -nr
    
por 25.05.2016 / 14:21
1

Solução Bash 4 utilizando matrizes inteiras associativas e para ambientes com extensões delimitadoras zero. Primeiro parâmetro é o diretório de destino, todos os parâmetros a seguir são encaminhados para file :

#!/bin/bash

# USAGE: script.sh PATH [PARAMS_FOR_FILE_CMD...]
# EXAMPLE 1: ./script.sh .
# EXAMPLE 2: ./script.sh /tmp --mime-type

path=$1
shift

if [[ ! -d "$path" ]]; then
  echo 'Path expected as first argument!' >&2
  echo "Usage: $(basename "$0") PATH [PARAMS_FOR_FILE_CMD...]" >&2
  exit 1
fi

declare -Ai type_stats

while IFS= read -r -d '' f; do

  t=$(file -b "$@" -- "$f")

  type_stats[$t]+=1

done < <(find "$path" -type f -print0)

for t in "${!type_stats[@]}"; do

  printf '\n%s\n-> %s\n
#!/bin/bash

# USAGE: script.sh PATH [PARAMS_FOR_FILE_CMD...]
# EXAMPLE 1: ./script.sh .
# EXAMPLE 2: ./script.sh /tmp --mime-type

path=$1
shift

if [[ ! -d "$path" ]]; then
  echo 'Path expected as first argument!' >&2
  echo "Usage: $(basename "$0") PATH [PARAMS_FOR_FILE_CMD...]" >&2
  exit 1
fi

declare -Ai type_stats

while IFS= read -r -d '' f; do

  t=$(file -b "$@" -- "$f")

  type_stats[$t]+=1

done < <(find "$path" -type f -print0)

for t in "${!type_stats[@]}"; do

  printf '\n%s\n-> %s\n%pre%' "$t" "${type_stats[$t]}"

done | sort -zrn -t'>' -k2
' "$t" "${type_stats[$t]}" done | sort -zrn -t'>' -k2

O desempenho deve ser OK e eu acho que lida com todos os nomes e tipos de arquivos (não com certeza, por exemplo, a menos que haja um tipo com '>').

    
por 25.05.2016 / 13:40