Como posso encontrar imagens inválidas?

0

Eu tenho um diretório com subdiretórios. Nos diretórios, há muitas imagens rastreadas da Web.

Como faço o loop de todos os arquivos e mostro os arquivos que não são arquivos de imagem válidos?

Não deve ser baseado na extensão de arquivo.

Eu criei este script:

find . -name '*.jpg' -o -name '*.jpeg' -o -name '*.gif' -o -name '*.png' | while read FILE; do
    if ! identify "$FILE" &> /dev/null; then
         echo "$FILE"
    fi  
done

Mas isso não está funcionando, porque também gera imagens valide.

    
por user1315960 15.06.2016 / 11:14

2 respostas

0
find . -type f \
       \( -name '*.jpg' -o -name '*.jpeg' -o -name '*.gif' -o -name '*.png' \) \
       -exec sh -c '! file -b --mime-type "$1" | grep -q "^image/"' sh {} \; \
       -print

Minha abordagem usa -exec para executar um teste personalizado em arquivos. Uma concha é necessária para construir um tubo. Um shell separado é executado para cada arquivo com a extensão correta, portanto, a solução é bem mal executada.

O shell executa file -b --mime-type e, em seguida, grep verifica se o resultado começa com image/ . ! no início do canal nega seu status de saída, portanto, todo o teste -exec é bem-sucedido se o arquivo não for realmente uma imagem. O caminho é então impresso.

Notas:

  1. Omit -name tests para verificar todos os arquivos.
  2. Ou talvez você queira usar -iname em vez de -name .
  3. -iname não é requerido pelo POSIX. Nem a opção -b nem --mime-type de file .
  4. O seguinte produz uma saída ligeiramente diferente e é mais rápido:

    find . -type f \
           \( -name '*.jpg' -o -name '*.jpeg' -o -name '*.gif' -o -name '*.png' \) \
           -exec file --mime-type {} + \
    | grep -v "\bimage/"
    

    mas alguns nomes de arquivos (por exemplo, com novas linhas) ou caminhos (com image/ ) irão quebrar a lógica.

por 16.10.2018 / 13:58