É mais ou menos possível, mas não sem ajuda de outro comando. Especificamente, aqui estamos usando o GNU awk (isso é importante, então verifique sua versão do awk)
$ du -ah | sort -nr | awk '{usage=$1; $1="";cmd="file "$0;cmd |& getline type;print usage,type ;close(cmd)}'
24K .: directory
4.0K ./testdir: directory
4.0K ./out.txt: ASCII text
4.0K ./3.txt: ASCII text
4.0K ./2.txt: ASCII text
4.0K ./1.txt: ASCII text
É claro que essa abordagem é um pouco falha, pois parece falhar com nomes de arquivos que contêm espaços (ainda trabalhando para melhorá-la)
Como alternativa, também podemos usar o comando find
para localizar todos os arquivos e executar os comandos file
e du
para fazer nossos lances via -exec
flag, mas isso parece um pouco feio (consulte o histórico de edições) . Poderíamos, no entanto, usar o sinal find
-printf
para imprimir o tipo de arquivo com o formato %y
para uma saída muito mais bonita.
$ find -mindepth 1 -printf "%y\t" -exec du "{}" \; | sort -rn
f 4 ./out.txt
f 4 ./3.txt
f 4 ./2.txt
f 4 ./1.txt
f 0 ./with space.txt
d 4 ./testdir
Obviamente, aqui f
é para arquivo regular e d
é para o diretório. Veja o manual de find
para mais informações sobre sinalizadores e letras de tipo de arquivo