Usando o comando find para listar os 5 principais arquivos de imagem por tamanho

0

Todos,
Quero listar os 5 principais arquivos de imagem (png, jpg) em uma determinada pasta. Qual é a melhor abordagem? Atualmente, estou usando o seguinte, mas não fornece a saída correta:

find . \( -iname \*.png -o -iname \*.jpg \)  -exec ls -lrhS {} \; | sort -n | head -5 | awk '{print $9, "=>",$5}'

Quando não canço para o comando head , vejo que a saída não está classificada corretamente. Como posso conseguir isso

    
por smokinguns 06.04.2012 / 06:55

5 respostas

1

Obrigado a todos apontando-me na direção certa. Acho que consegui que funcionasse usando:

find . \( -iname \*.png -o -iname \*.jpg \) -print0 | xargs -0 ls -l | sort -k5 -r | head -5

Eu processarei essa saída para obter a saída no formato desejado (por exemplo, com sufixos como B, K)

    
por 06.04.2012 / 18:08
1

Se por "top 5" você quer dizer por tamanho, então você precisa dizer sort para qual coluna classificar; o padrão passará por todas as colunas em ordem, o que significa classificar inicialmente pelo número de links. Além disso, sem algum tipo de extensão, o tamanho "legível por humanos" não será ordenado, exceto no GNU sort ; portatil sort -n não sabe sobre sufixos como B , K , etc. Note também que você perde as informações de ordenação que você pediu ls porque está sendo executado em arquivos individuais sob o controle de find . E, em seguida, o seu sort classifica do menor para o maior, por isso mesmo corrigindo que você obtenha as cinco menores imagens de head . (E o || antes de awk um erro de digitação? Você está dizendo para executar awk somente se o fluxo find falhar.)

Combinando tudo isso e otimizando usando xargs para agrupar as coisas e combinando o head no awk , o que você quer é ter certeza que você tem o GNU sort , então use

find . \( -iname \*.png -o -iname \*.jpg \) -print0 | xargs -0 ls -lh | sort -k5gr,5 | awk 'NR <= 5 {print $9, "=>", $5}'
    
por 06.04.2012 / 07:13
1
find . \( -iname "*.png" -o -iname "*.jpg" \) -printf "%k\t%p\n" | sort -rn | head -5
  1. Usos encontrados de acordo com seus requisitos no diretório atual (suponho que você queira dizer "diretório atual E subdiretórios, caso contrário, adicione -maxdepth 1 ).
  2. Imprime o tamanho (em blocos de 1 KB), seguido por tab, seguido por nome de arquivo.
  3. Classifica numericamente ao contrário.
  4. Escolhe as primeiras cinco linhas.

et voilà!

(Possível ressalva é o nome dos arquivos contendo novas linhas, mas na prática eu nunca os vi. Requer alguma modificação simples para explicar isso também)

    
por 06.04.2012 / 11:31
0

Você quer dizer "top" como em maior tamanho? O comando S no seu comando ls já classifica por tamanho, mas r inverte o pedido, classificando-o de menor para o topo. Talvez você queira tentar o -exec ls -lhS {} \; | head -5 (omitir o sort separado).

    
por 06.04.2012 / 07:12
0

Meio que muito direto:

find . -ls | sort -nk7 | tail -5
    
por 06.04.2012 / 08:22