Melhor maneira de trabalhar / exibir uma árvore de imagens ordenadas por tamanho

4

Eu tenho uma árvore de diretórios profunda contendo arquivos .PNG. Eu gostaria de encontrar todos os arquivos .PNG no diretório, classificá-los em ordem de tamanho do menor para o maior e, em seguida, exibir cada imagem 50.

(Estou analisando dados e tentando encontrar o melhor corte de tamanho entre "potencialmente útil" e "ruído aleatório", por isso quero uma maneira fácil de percorrer essas milhares de imagens ...)

Qualquer ajuda de script é apreciada. Eu sei como usar 'localizar' para pesquisar por tamanho, mas não como classificar os resultados ou executar um programa de exibição para exibir a cada 50 sem ter que pausar o processo em espera.

Estou usando o MacOS Snow Leopard, por enquanto.

Obrigado!

    
por radven 02.01.2011 / 03:41

3 respostas

6

O tamanho é igual ao tamanho do arquivo ou ao tamanho das dimensões da imagem?

Em zsh, para ver todos os arquivos .png no diretório atual e seus subdiretórios, classificados aumentando o tamanho do arquivo:

echo **/*.png(oL)

Não há qualificador de glob conveniente para pegar todos os N arquivos. Aqui está um loop que define a matriz $a para conter todos os 50 arquivos (começando com o maior).

a=() i=0
for x in **/*.png(OL); do
  ((i%50)) || a+=$x
  ((++i))
done
my-favorite-image-viewer $a

Sem o zsh ou o GNU find, não há uma maneira fácil de classificar find output por metadados (há find -ls ou find -exec ls ou find -exec stat , mas eles podem não funcionar com arquivos que contêm caracteres não imprimíveis, então não gosto de recomendá-los). Aqui está uma maneira de fazer isso em Perl.

find . -name '*.png' |
perl -e '
    $, = "\n";  # separate elements by newlines in the output
    print  # print…
        sort {-s $a <=> -s $b}  # …sorted by file size…
            map {chomp;$_} <>  #…the input lines (with the newline bitten off)
'

E aqui está uma maneira de visualizar todos os 50 arquivos (começando com o maior):

find . -name '*.png' |
perl -e '
    $, = "\n";
    exec "my-favorite-image-viewer",
        map {$i++ % 50 ? () : $_}  # every 50
            sort {-s $b <=> -s $a} map {chomp;$_} <>
'

Outra abordagem seria criar links simbólicos em um único diretório, com nomes ordenados por tamanho de arquivo. Em zsh:

mkdir tmp && cd tmp
i=1000000  # the extra 1 on the left ensures alignment
for x in ../**/*(oL); do
    ((++i))
    ln -s $x ${i#1}.png
done

com o Perl:

mkdir tmp && cd tmp
find .. -name '*.png' |
perl -e '
    $, = "\n";
    for $x (sort {-s $a <=> -s $b} map {chomp;$_} <>) {
        symlink $x, sprintf("%06d", ++$i);
    }
'
    
por 02.01.2011 / 15:23
0

Basta combinar find para pesquisar *.png , ls ou stat para obter o tamanho do arquivo, sort para classificar por tamanho de arquivo e awk para imprimir somente a cada 50 linhas.

    
por 02.01.2011 / 09:23
0

Se você não tem ferramentas GNU ou se seus nomes de arquivos contêm muitos caracteres especiais, eu usaria um excelentes soluções da Gilles .

No entanto, aqui está uma solução usando o GNU find , sort , cut e awk - basicamente o conjunto de ferramentas que alex sugerido :

$ find -iname "*.png" -exec ls -s {} + | sort -n | cut -d" " --complement -f1 | awk '{ if ( NR % 50 == 0 ) print}' | xargs -d"\n" eog

Aqui eu usei olho-de-gnome ( eog ) como visualizador de imagens, principalmente porque era um dos poucos que eu consegui encontrar que tomar vários argumentos de linha de comando e faz algo sensato com isso.

Tenho certeza de que é possível remover o sort e o cut em favor de mais um pouco do código awk . Para ser completamente honesto, não sei como essa solução irá interagir com o espaço em branco.

    
por 02.01.2011 / 18:13