Verifique a integridade de imagens JPG com o jpeginfo

O jpeginfo pode ajudar a verificar automaticamente a integridade de uma quantidade enorme de imagens, em seu sistema Linux.
Trata-se de um pequeno utilitário de linha de comando (CLI), flexível, rápido e eficiente.
linux jpeginfo
Posso usar o jpeginfo para checar um único arquivo de imagem ou centenas deles.
Como, para um trabalho desta natureza, você quer resultados rápidos, as ferramentas CLI são a melhor opção — por que conseguem mostrar os resultados que você deseja, com o menor consumo possível de recursos do sistema.

Como instalar o jpeginfo

No Debian e no Ubuntu, ele pode ser instalado, com o apt:

sudo apt install jpeginfo
 _

Trata-se de um programa muito pequeno, que não vai pesar no sistema — caso você se preocupe com estes detalhes. Além disto, sempre é possível removê-lo, depois de realizar o seu trabalho.
Se estiver curioso, você pode conferir o tamanho dele com a opção ‘show’ do apt:

apt show jpeginfo | grep -i size

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Installed-Size: 25,6 kB
Download-Size: 13,2 kB
 _

Ele pode ser instalado em questão de segundos, como você pode ver.

O tamanho do jpeginfo, após a instalação, é aproximadamente 25 Kb.

Como verificar a integridade das minhas fotos?

Como eu disse, dá pra verificar apenas uma imagem, assim:

jpeginfo --check System76-System76_Brandmark_Blue-by_Kate_Hazen_of_System76.jpg 
 _

O texto “[OK]”, ao final das informações básicas do arquivo, indica que está tudo bem com ele:

System76-System76_Brandmark_Blue-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  985882  [OK]
 _
jpeginfo --check foto-danificada.jpg
 _

… ou você pode obter uma indicação de que há “[ERROR]”:

foto-danificada.jpg  Not a JPEG file: starts with 0x5c 0x6e  [ERROR]
 _

Você pode pedir para verificar todas as imagens do diretório corrente, com o uso de curingas:

jpeginfo --check *.jpg
 _
foto-danificada.jpg  Not a JPEG file: starts with 0x5c 0x6e  [ERROR]
System76-Old_Man_Smoked_His_Pipe-by_Ian_Hex_of_LightSweep.jpg 2560 x 1440 24bit JFIF  P 3768044  [OK]
System76-System76_Brandmark_Blue-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  985882  [OK]
System76-System76_Brandmark_Gray-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  824133  [OK]
System76-System76_Brandmark_Yellow-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  952200  [OK]
System76-System76_Logo_Blue-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  974983  [OK]
System76-System76_Logo_Gray-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  731859  [OK]
System76-System76_Logo_Yellow-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  943715  [OK]
 _

Observe que as informações, na listagem normal, vêm em colunas:

  1. nome do arquivo
  2. resolução da imagem
  3. profundidade das cores
  4. padrão do arquivo de imagem
  5. padrão da decodificação (progressiva, interpolada etc.)
  6. Tamanho, em bytes

Na última coluna, o resultado do teste.

A sigla JFIF, que aparece na lista acima, significa JPEG File Interchange Format. Trata-se do formato padrão do arquivo da imagem.
Este formato é compatível com o padrão JPEG Interchange Format (JIF) e resolve algumas de suas limitações de codificação.
Tal como todos os arquivos JIF, os dados contidos em imagens JFIF comprimidos com o uso de técnicas no padrão JPEG, uma vez que as imagens JFIF são comumente chamadas “JPEG/JFIF”.

Use a opção ‘–lsstyle’, para ver o resultado organizado de outra forma:

jpeginfo --check --lsstyle *.jpg
 Not a JPEG file: starts with 0x5c 0x6e  foto-danificada.jpg [ERROR]
2560 x 1440 24bit JFIF  P 3768044 System76-Old_Man_Smoked_His_Pipe-by_Ian_Hex_of_LightSweep.jpg  [OK]
2560 x 1440 24bit JFIF  P  985882 System76-System76_Brandmark_Blue-by_Kate_Hazen_of_System76.jpg  [OK]
2560 x 1440 24bit JFIF  P  824133 System76-System76_Brandmark_Gray-by_Kate_Hazen_of_System76.jpg  [OK]
2560 x 1440 24bit JFIF  P  952200 System76-System76_Brandmark_Yellow-by_Kate_Hazen_of_System76.jpg  [OK]
2560 x 1440 24bit JFIF  P  974983 System76-System76_Logo_Blue-by_Kate_Hazen_of_System76.jpg  [OK]
2560 x 1440 24bit JFIF  P  731859 System76-System76_Logo_Gray-by_Kate_Hazen_of_System76.jpg  [OK]
2560 x 1440 24bit JFIF  P  943715 System76-System76_Logo_Yellow-by_Kate_Hazen_of_System76.jpg  [OK]
_

Use o comando grep, para ver apenas os resultados que retornaram erro:

jpeginfo --check --lsstyle *.jpg | grep -i error
_
 Not a JPEG file: starts with 0x5c 0x6e  foto-danificada.jpg [ERROR]
_

Use a opção ‘–delete’, para remover automaticamente todos os arquivos que forem encontrados com erros:

jpeginfo --delete *.jpg
_

Use a opção ‘–info’, para obter mais detalhes nas informações sobre cada arquivo:

jpeginfo --info *.jpg
_
System76-Old_Man_Smoked_His_Pipe-by_Ian_Hex_of_LightSweep.jpg 2560 x 1440 24bit JFIF  Progressive Huffman,300dpi 3768044 
System76-System76_Brandmark_Blue-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  Progressive Huffman,150dpi  985882 
System76-System76_Brandmark_Gray-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  Progressive Huffman,150dpi  824133 
System76-System76_Brandmark_Yellow-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  Progressive Huffman,150dpi  952200 
System76-System76_Logo_Blue-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  Progressive Huffman,150dpi  974983 
System76-System76_Logo_Gray-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  Progressive Huffman,150dpi  731859 
System76-System76_Logo_Yellow-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  Progressive Huffman,150dpi  943715 
_

Calcule a soma MD5, ou MD5 checksum, com a opção ‘–md5’:

jpeginfo --md5 *.jpg
_
System76-Old_Man_Smoked_His_Pipe-by_Ian_Hex_of_LightSweep.jpg 2560 x 1440 24bit JFIF  P 3768044 f45c6abe65faff92c753ca24ec5f8152 
System76-System76_Brandmark_Blue-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  985882 3fc69c0484860c02b21cb6582067c28b 
System76-System76_Brandmark_Gray-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  824133 3406d52789e7a79cf9efc76135416cf4 
System76-System76_Brandmark_Yellow-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  952200 bb1cd2cd03730e8e56d5876c6638de47 
System76-System76_Logo_Blue-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  974983 dc2e914b26c91dceb745baab1dd677aa 
System76-System76_Logo_Gray-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  731859 9efd7ded3aceb671a708bac28a7aeb6a 
System76-System76_Logo_Yellow-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  943715 30ee050e0c5d14b7c9c6f44b7df2fff4
_

Fazer o cálculo da soma MD5, é útil para quem vai fazer a transmissão de uma grande quantidade de arquivos de imagem e deseja obter uma checagem, no final, de que a transferência ocorrem sem incidentes.
Como você já deve ter percebido, pode combinar várias opções na mesma linha.
Para saber mais sobre o jpeginfo, use a opção ‘–help’ ou consulte o manual do sistema: man jpeginfo.

MySQL: use o mysqlcheck para fazer manutenção das suas tabelas

O programa cliente mysqlcheck oferece uma maneira eficiente para executar a manutenção das tabelas em seu banco de dados — ele verifica, conserta, otimiza ou apenas analisa as tabelas dentro do banco de dados.
O mysqlcheck deve ser usado quando o servidor mysqld está rodando — uma de suas primeiras vantagens é essa: a de não precisar indisponibilizar o servidor para fazer uma manutenção no seu sistema de banco de dados.
O mysqlcheck é um “frontend”. Ele se autentica no MySQL e execute as declarações CHECK TABLE, REPAIR TABLE, ANALYZE TABLE e OPTIMIZE TABLE do modo mais conveniente pro usuário. Ele determina a forma mais adequada para cada declaração de acordo com a operação pedida, na linha de comando, e a envia ao servidor para ser executada.
É o indicado para realizar as tarefas de manutenção em tabelas MyISAM. Outros mecanismos de armazenamento (storage engines) podem não suportar todas as operações, nestes casos, mensagens de erro irão surgir para te informar do fato:

note    : The storage engine for the table doesn't support check
PRECAUÇÕES

Você deve fazer backup dos dados nas tabelas antes de inciar uma operação de restauração (repair) nestas tabelas. Sob certas circunstâncias, a operação pode causar perda de dados.
Algumas causas de perda de dados podem estar ligadas a sistemas de arquivos com erros.

De acordo com o manual oficial do MySQL, há 3 sintaxes possíveis pro comando mysqlcheck:

mysqlcheck [opcoes] nome_do_banco [nome_da_tabela1 nome_da_tabela2 ...]
mysqlcheck [opcoes] --databases nome_do_banco1 nome_do_banco2 ...
mysqlcheck [opcoes] --all-databases

Daqui pra frente, vamos desenvolver melhor o assunto e algumas das opções mais comuns de uso do comando.

Como verificar uma tabela dentro do banco de dados

Se seu aplicativo retornou uma mensagem de erro, informando que uma determinada tabela está corrupta, execute o mysqlcheck assim:

mysqlcheck -c nome_do_banco nome_da_tabela -u root -p

forneça a senha, assim que lhe for pedido e aguarde o resultado:

nome_do_banco.nome_da_tabela      OK

Se a senha e/ou nome de usuário estiver errada, o sistema emitirá uma mensagem de erro semelhante a esta:

mysqlcheck: Got error: 1045: Access denied for user 'root'@'localhost' (using password: NO) when trying to connect

A opção -c é a que indica que a operação a ser realizada é de checagem (verificatória).

Como verificar todas as tabelas em um banco de dados

Se quiser verificar todas as tabelas dentro de um banco de dados, com o mysqlcheck, omita seus nomes. Forneça apenas o nome do banco de dados que as contém (no meu caso, é clientes):

mysqlcheck -c clientes -u root -p

O meu resultado foi este:
clientes.CLPJ OK
clientes.CLCD OK
clientes.CLPD OK
clientes.CLCT OK[/plain]

Como checar todas as tabelas e bancos de dados

Para realizar uma checagem desta amplitude, o comando executado é bem curto:

mysqlcheck c -u root -p --all-databases

Você pode executar o mysqlcheck em mais de um banco de dados (sem ser todos), assim, com a opção --databases. No exemplo, que segue, o comando será executado em todas as tabelas dentro dos bancos de dados fornecedores e clientes:

mysqlcheck -c -u root -p --databases fornecedores clientes

Como analisar tabelas usando o mysqlcheck

O exemplo que segue, usa o comando mysqlcheck, com a opção -a para analisar a tabela cadastros, dentro do banco de dados clientes:

mysqlcheck -a clientes cadastros -u root -p

Internamente, o mysqlcheck roda a declaração ANALYZE TABLE em relação à clientes. Enquanto trabalha, trava a tabela, permitindo apenas a sua leitura – motivo, pelo qual, você não deve fazer estas tarefas em horários de pico.

Use o mysqlcheck para otimizar tabelas

No exemplo que segue, o mysqlcheck é usado para otimizar a tabela projetos, dentro do banco de dados clientes.

mysqlcheck -o clientes projetos -u root -p
Enter password: 
clientes.projetos                                  Table is already up to date

Como já disse, o comando mysqlcheck executa um comando MySQL internamente. Neste caso, o OPTIMIZE TABLE.
À medida em que você vai removendo registros das suas tabelas, espaços sem uso vão ficando no meio. Este comando funciona semelhante ao desfragmentador de alguns sistemas operacionais, reorganizando os espaços, o que melhora a performance em tabelas que já tenham passado por grandes quantidades de alterações.

Restaure, conserte tabelas com o comando mysqlcheck

Aqui, o mysqlcheck vai usar internamente o comando REPAIR TABLE, que repara (conserta) uma tabela MyISAM corrompida.
Veja como:

mysqlcheck -r clientes projetos -u root -p

Combine diversas tarefas em uma só declaração mysqlcheck

É claro que, para a sua comodidade, é possível combinar diversas tarefas para serem executadas pelo mysqlcheck, em apenas uma linha de comando. veja como combinar CHECK, OPTIMIZE e REPAIR e mais a opção --auto-repair, dentro do banco de dados clientes (adeque o comando à sua realidade):

mysqlcheck -u root -p --auto-repair -o clientes

Ou em todas as tabelas, em todos os bancos de dados:

mysqlcheck -u root -p --auto-repair -o --all-databases
LEIA MAIS:
  • Comandos (internos) de manutenção — rápida noção dos comandos REPAIR, ANALYZE, CHECK e OPTIMIZE.
  • Otimize suas consultas — use o QUERY CACHE!
  • Outras opções úteis pro mysqlcheck

    Para ter um feedback maior do que está sendo feito pelo programa, use a opção –debug-info. Ela é mais voltada para encontrar erros dentro do próprio programa, para desenvolvedores – mas é uma mão na roda para administradores de MySQL que desejam ter um maior controle do que o comando está executando. Veja, no exemplo, como a saída oferece mais informações.

    mysqlcheck -u root -p --debug-info --auto-repair clientes projetos
    Enter password: 
    clientes.projetos                                  OK
    User time 0.01, System time 0.00
    Maximum resident set size 1584, Integral resident set size 0
    Non-physical pagefaults 538, Physical pagefaults 0, Swaps 0
    Blocks in 0 out 0, Messages in 0 out 0, Signals 0
    Voluntary context switches 3, Involuntary context switches 17

    MySQL: comandos para manutenção do banco de dados

    De maneira bem breve, vou listar 4 comandos MySQL relacionados à manutenção dos seus bancos de dados. Neste texto, serão descritos de forma bem sucinta e rápida. É mais ou menos um lembrete para quem é administrador iniciante e ainda não criou os bons hábitos de verificação dos seus bancos de dados.

    Check table

    Com suporte ao MyISAM e ao InnoDB, o comando CHECK TABLE pode ser usado para verificar erros e inconsistências nas tabelas.
    Sua sintaxe é simples mas você precisa ter privilégios adequados para poder rodar este comando:

    
    CHECK TABLE projetos QUICK;
    
    +-------------------+-------+----------+----------+
    | Table             | Op    | Msg_type | Msg_text |
    +-------------------+-------+----------+----------+
    | clientes.projetos | check | status   | OK       |
    +-------------------+-------+----------+----------+
    1 row in set (0.09 sec)
    

    Repair table

    Se houver erros detectados por CHECK TABLE, será necessário usar o REPAIR na sua tabela.

    
    REPAIR TABLE projetos;
    
    +-------------------+--------+----------+----------+
    | Table             | Op     | Msg_type | Msg_text |
    +-------------------+--------+----------+----------+
    | clientes.projetos | repair | status   | OK       |
    +-------------------+--------+----------+----------+
    1 row in set (0.00 sec)
    

    Analyze table

    Este comando (exemplo abaixo) analisa e armazena a distribution key da tabela. Enquanto isto, ele a trava, impedindo que seja alterada temporariamente – ela só pode ser lida.

    O que é distribution key

    Uma distribution key ou chave de distribuição é uma coluna (ou grupo de colunas) usada para determinar a partição do banco de dados em que um registro, em particular, será armazenado.
    Você define uma distribution key em uma tabela através do comando CREATE TABLE.

    
    ANALYZE TABLE projetos;
    
    +-------------------+---------+----------+-----------------------------+
    | Table             | Op      | Msg_type | Msg_text                    |
    +-------------------+---------+----------+-----------------------------+
    | clientes.projetos | analyze | status   | Table is already up to date |
    +-------------------+---------+----------+-----------------------------+
    1 row in set (0.01 sec)
    
    

    Optimize table

    Se você executa muitas operações de remoção de registros (DELETE), provavelmente precisará da declaração OPTIMIZE TABLE para fazer uso de espaços liberados e desfragmentar o arquivo de dados.

    
    OPTIMIZE TABLE projetos;
    
    +-------------------+----------+----------+----------+
    | Table             | Op       | Msg_type | Msg_text |
    +-------------------+----------+----------+----------+
    | clientes.projetos | optimize | status   | OK       |
    +-------------------+----------+----------+----------+
    1 row in set (0.04 sec)