Como encontrar arquivos de imagem por conteúdo

6

Eu tenho uma lista de arquivos e preciso encontrar todos os arquivos de imagem dessa lista.

Por exemplo, se minha lista continha o seguinte:

pidgin.tar.gz
photo01.jpg
picture01
screenshot.gif
invoice.pdf

Então, gostaria apenas de selecionar:

photo01.jpg
picture01
screenshot.gif

Notas:

  • O método não deve depender de extensões de arquivo
  • Os formatos de imagem obscura do Photoshop e do Gimp podem ser ignorados. (Se feh não puder mostrar, não é uma imagem)
por Stefan 12.09.2010 / 23:24

5 respostas

7

O comando a seguir lista as linhas em list_file que contêm o nome de um arquivo de imagem:

<list_file xargs -d \n file -i | sed -n 's!: *image/[^ :]*$!!p'
  • file -i FOO observa os primeiros bytes de FOO para determinar seu formato e imprime uma linha como FOO: image/jpeg ( -i significa mostrar um tipo MIME; é específico do arquivo GNU encontrado no Linux).
  • xargs -d \n lê uma lista de arquivos (um por linha) da entrada padrão e aplica o comando subsequente a ela. (Isso requer GNU xargs como encontrado no Linux; em outros sistemas, deixe de fora -d \n , mas a lista de arquivos não pode conter \'" ou espaço em branco).
  • O comando sed filtra o sufixo : image/FOO para exibir apenas os nomes dos arquivos. Ele ignora as linhas que não correspondem aos arquivos de imagem.
por 12.09.2010 / 23:59
2
file -ib image | awk '"^image/" {print}'

Se o arquivo detectar a imagem, ele deverá imprimir a linha como:

image/jpeg; charset=binary

Funciona em números mágicos, portanto não é baseado em extensões.

    
por 12.09.2010 / 23:33
1

Além do comando file , você também pode usar o ImageMagick. O seguinte mostrará o tipo de todos os arquivos no diretório atual:

find -type f -depth 0 -print0 | xargs -0 identify

O comando identify imprimirá algo assim para vários tipos de arquivo:

text.txt[8] TXT 612x792 612x792+0+0 16-bit DirectClass 694B 0.320u 0:00.330
php.jpg[31] JPEG 1280x1024 1280x1024+0+0 8-bit DirectClass 195KB 0.000u 0:00.000

Arquivos GIF animados imprimem mais informações (este é um GIF de 21 quadros):

adhd.gif[0] GIF 211x200 211x200+0+0 8-bit PseudoClass 256c 233KB 0.000u 0:00.029
adhd.gif[1] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.029
adhd.gif[2] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.029
...
adhd.gif[18] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.000
adhd.gif[19] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.000
adhd.gif[20] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.000

Você pode usar awk ou ferramentas semelhantes para decidir o que fazer com elas.

    
por 13.09.2010 / 04:02
1

Se você tem Python e python-magic . Por exemplo

#!/usr/bin/env python
import magic
import os
path=sys.argv[1]
mime = magic.open(magic.MAGIC_NONE)
mime.load()
for r,d,f in os.walk(path):
    for files in f:
        filename=os.path.join(r,files)
        filetype=mime.file(filename)
        if "image" in filetype:
            print "File: %s is %s" %(filename, filetype)
    
por 13.09.2010 / 08:19
0

Talvez haja algo que esteja faltando, mas isso parece funcionar para mim:

file -i * | grep "image/" | cut -d: -f1
    
por 02.03.2012 / 19:37