A filosofia unix é fornecer os blocos de construção e permitir que você monte esses blocos de construção para executar tarefas especializadas como esta.
O comando find
atravessa uma árvore de diretórios e lista arquivos correspondentes a determinados critérios ou atua sobre eles. Por exemplo, find -xdev /
percorre todos os arquivos no sistema de arquivos raiz e exibe seu nome. A opção -xdev
omite arquivos em outros sistemas de arquivos, como montagens de rede, sistemas de arquivos especiais que fornecem informações do sistema, etc.
Para escolher o que é impresso, o GNU encontra oferece o -printf
action . A %f
diretiva imprime nomes de arquivos sem uma parte do diretório.
Os nomes de arquivos do Linux podem conter qualquer byte, exceto barras (que são separadores de diretórios) e bytes nulos. Se você estiver disposto a assumir que seus nomes de arquivo não contêm caracteres de nova linha, o processamento de nomes de arquivos será mais simples. Por segurança, você pode excluir nomes de arquivos que contenham uma nova linha.
find / -xdev ! -name $'*\n*' -printf '%f\n'
Para selecionar arquivos que tenham uma extensão, combinaremos um nome que contenha um ponto que não seja o primeiro caractere e apenas arquivos regulares (você pode ou não querer incluir links simbólicos também).
find / -xdev -name '?*.*' ! -name $'*\n*' -type f -printf '%f\n'
Chega com find
. Para trabalhar nas extensões, usaremos ferramentas de processamento de texto, usando um pipeline de shell para combiná-las. Primeiro sed para fazer um pouco de reescrita para eliminar a parte do nome do arquivo que não é a extensão:
find / -xdev -name '?*.*' ! -name $'*\n*' -type f -printf '%f\n' |
sed 's/.*\.//'
E, finalmente, para contar o número de ocorrências de cada extensão, nós classificamos a saída e contam duplicatas , e finalmente classificam o resultado por número de ocorrências.
find / -xdev -name '?*.*' ! -name $'*\n*' -type f -printf '%f\n' |
sed 's/.*\.//' | sort | uniq -c | sort -n