Use sort | uniq -c
para contar linhas idênticas:
find "$path" -type f -exec file -b {} + | sort | uniq -c | sort -nr
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:
(últimos dois pontos são praticamente exclusivos)
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 '>').
Tags bash find file-types