list & sort subpastas por número de itens

2

Estou tentando escrever um script para listar & ordenar subpastas por número de itens.

Veja o que eu tenho:

find * | wc -l funciona para retornar a contagem de itens.

E for f in *; do echo "$f"; find "$f" | wc -l ; done funciona, mas a lista é difícil de analisar.

Então, tentei usar printf :

for f in *; do 
   c='echo find "$f" | wc -l' ; 
   printf "$c $f\n"; 
done

Mas retorna 1 para cada subpasta.

Eu gostaria de classificar a lista final pelo número de itens em cada subpasta.

    
por Ze'ev 26.11.2014 / 23:12

2 respostas

1

Isso me intrigou, então eu tentei, aqui está meu código:

#!/bin/bash

startIFS=$IFS
IFS=$'\n'

function echocount {
dirs=$(find -type d)
for f in $dirs; do
   c=$(find "$f" -maxdepth 1 -type f | wc -l) ;
   echo "$c $f";
done
}

echocount | sort -n

IFS=$startIFS

Eu acho isso muito estúpido e irritante em scripts de shell, mas eu preciso mudar o IFS para que apenas novas linhas e não espaços signifiquem outro diretório e o loop seja executado corretamente.

BTW, no seu código, a razão de sempre ter uma contagem de 1 é porque, em echo find "$f" | wc -l , você está realmente contando as linhas em echo find "$f" , que sempre será uma única linha (está apenas ecoando literalmente "localizar seja qual for ", na verdade não executando o comando find). Se você retirar o echo , ele fará o que você espera.

Além disso, os pedantes informam que a notação de backtick está obsoleta. Eu acho a notação $ () mais legível de qualquer maneira.

    
por 27.11.2014 / 00:36
1

Com orientação do localhost, minha solução é:

for f in */; do 
  c=$(find "$f" | wc -l) ; 
  printf "$c $f\n"; 
done | sort -n
    
por 27.11.2014 / 22:24

Tags