du comando - mostra o arquivo ou pasta na saída?

4

Se eu executar o comando du -ah | sort -nr , é possível mostrar qual linha na saída é um arquivo e qual pasta? Algo como o comando ls -l mostra qual é o arquivo e a pasta com d e - na frente.

    
por user1800997 31.12.2016 / 10:49

2 respostas

8

É 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

    
por Sergiy Kolodyazhnyy 31.12.2016 / 10:59
6

Como Serg diz, du não pode fazer isso sozinho. Para processar nomes de arquivos com segurança, a melhor maneira é separá-los com o caractere nulo ASCII ( du ), e sort pode fazer isso . Portanto, usando isso, junto com a capacidade xargs e -0 'de manipular entradas delimitadas por nulo:

du -0ah |
  sort -zh |
  xargs -0 sh -c 'for i; do s=${i%%[[:space:]]*};f=${i#*[[:space:]]}; echo "$s" "$(ls --color -dF "$f")"; done' _

As opções -z , -0 e du informam sort , xargs e s=${i%[[:space:]]*} a usar o nulo ASCII como o separador.

Em seguida, f=${i#*[[:space:]]} para obter o início da linha até o espaço em branco (que é o tamanho) e ls para obter todo o restante (o nome do arquivo). Em seguida, obtemos ls --color para imprimir o nome do arquivo com a decoração.

Exemplo:

$ du -0ah Screenshots | sort -zh | xargs -0 sh -c 'for i; do s=${i%%[[:space:]]*};f=${i#*[[:space:]]}; echo "$s" "$(ls --color -dF "$f")"; done' _
512 Screenshots/desktop.ini*
264K Screenshots/Screenshot (1).png*
269K Screenshots/

Como usei %code% , também recebo uma boa saída de cores:

    
por muru 31.12.2016 / 11:37

Tags