Como evitar arquivos RAW corrompidos e danificados

Recentemente, tive que lidar com uma grande quantidade de arquivos de imagens RAW corrompidos durante o processo de transferência do cartão de memória para o HD interno do meu laptop.
Para contextualizar, a câmera usada era uma Canon EOS Rebel T6 (ou 1300D, a depender do mercado em que é comercializada). Mas a culpa não é da câmera — pelo menos não neste caso.

O problema ocorria tanto no Windows 10, como no uso do Linux (Debian 10 e POP_OS). Não testei no MacOS. Sorry…

Por que as imagens se corrompem durante a transferência

Vários fatores podem concorrer para estragar as suas imagens RAW durante a transferência do cartão para o computador.

Este tipo de imagem é muito maior que as imagens em JPEG e carregam uma quantidade muito maior de informações sensíveis. Se algo se perder no caminho, a imagem inteira poderá restar inutilizada.

Atualmente, prefiro usar sempre o Shotwell para fazer as minhas transferências. Uma das boas características do programa é que ele extrai o JPEG embutido no RAW e grava no mesmo diretório para o qual está copiando seus arquivos.
No meu caso, isto ajudava a ter pelo menos uma cópia em JPEG usável, quando o RAW estava corrompido.
Ubuntu Nautilus

Arquivos “crus” .CR2 e .CR3 da Canon contém imagens JPEG embutidos e já tratados pelo processamento interno da sua máquina fotográfica. Por este motivo, não é necessário usar a configuração de registrar em RAW+JPEG, presente no menu do seu equipamento.
O único efeito desta redundância é sobrecarregar o “buffer” da sua máquina, o que diminui a velocidade do modo contínuo (ou burst mode).

Eu vou listar algumas situações que podem causar danos aos seus arquivos durante a transferência:

  1. Ao usar um leitor de cartões USB externo, você tem pelo menos 3 conexões críticas pelas quais os dados precisam passar: do cartão para o leitor; do leitor para o cabo USB; do cabo USB para o computador. Se houver algum problema em um destes pontos, você provavelmente terá alguns arquivos estragados.
  2. Se você usa um cartão de memória “combo”, ou seja um micro SD dentro de um adaptador SD, adicione uma conexão a mais ao problema.

Para mim, o estrago ocorria por uma sucessão de fatores. Usar um cartão combo, no meu laptop Dell, era um deles.
Como o leitor embutido do notebook não é muito apertado, provavelmente permite alguma folga entre o microSD e o invólucro adaptador SD, que causava pequenas interrupções nos contatos e, consequentemente, interrompia o fluxo de dados.

Como resolvi o problema

Eu pude resolver o problema com as seguintes ações:

  • Usar um adaptador SD/MicroSD mais justo/apertado.
  • Usar um leitor externo com uma entrada muito apertada e que não permite folgas entre cartão, adaptador e leitor USB.
  • Substituir o MicroSD com adaptador por um cartão SD “puro”, de alta velocidade. Neste caso, ele funcionou perfeitamente, ao ser conectado ao leitor interno do laptop.

Qualquer uma destas medidas resolveu o problema de arquivos RAW corrompidos para mim.

Espero que este relato possa ajudá-lo(a) a resolver o seu problema, aí.

Referências

Câmera Canon EOS Rebel T6: https://amzn.to/2k9JyOc.
Cartão SDHC Extreme: https://amzn.to/2LiJO9V.

Copie arquivos entre dispositivos, com a máxima segurança, usando o grsync

O Grsync é uma interface gráfica para o programa de cópias rsync, desenvolvida em GTK2.
Até o momento, suporta os recursos mais importantes do rsync da linha de comando e é indicado para realizar sincronização de diretórios locais.

Pode ser chamado da interface gráfica, como qualquer outro programa e tem versões para Windows, Mac e Linux.

Se preferir executar da linha de comando (CLI), é possível especificar uma determinada sessão a ser carregada, em vez da sessão padrão.
Se nenhum parâmetro for dado, na CLI, ele carrega a última tarefa realizada, o que facilita a vida de quem sempre usa o rsync de uma só maneira, para copiar os mesmos arquivos para o mesmo destino.

Como instalar o Grsync

Usuários Windows e Mac, vejam os links de download ao final do post.

Para a turma do Linux, o aplicativo faz parte dos repositórios (lojas) oficiais das principais distribuições.
Debian Ubuntu Instalar programas

Será fácil encontrá-lo no seu gerenciador/instalador de programas (ou loja de apps).
Instalação do grsync

Quem prefere a linha de comando, pode usar o apt (Debian/Ubuntu):


sudo apt install grsync

Como usar o Grsync

Basicamente, tudo o que se precisa fazer é indicar a pasta/diretório de origem e o destino.
Claro que há uma série de outras opções de ajustes para as suas cópias saírem de acordo com as suas necessidades.
A interface está quase toda traduzida para o português, o que facilita fazer suas escolhas, quanto ao modo de operação do programa.
Tela do Grsync

Você pode passar o cursor do mouse sobre as alternativas do painel, para obter uma ajuda sensível ao contexto, através de uma pop up box.
O painel de opções avançadas apresenta itens de segurança de dados durante a cópia e um espaço, semelhante à linha de comando, para personalizar suas opções.

Durante a execução, o Grsync exibe o andamento das cópias individuais (no caso de vários arquivos) e no decurso total da tarefa.

Não há nada que o Grsync faça que não seja possível realizar, com mais flexibilidade e controle, na linha de comando com o rsync.
Mas é uma aplicação alternativa e excelente para quem prefere usar a GUI para transferência de arquivos.

Se quiser saber mais sobre o rsync, leia aqui.

Referências

Página de download da versão para Windows: http://grsync-win.sourceforge.net/
Página de download da versão para Mac: http://grsync-mac.tuxfamily.org/?lang=en

Como monitorar a transferência de dados durante a cópia ou backup.

Sistemas operacionais UNIX ou GNU/Linux possuem um comando de cópia tradicional para a CLI: o cp.
Quando há vários arquivos para transferir de um diretório a outro, é possível acompanhar a finalização da transferência de cada um deles.

Mas só ficamos sabendo da finalização individual de cada cópia de arquivo.
Na GUI (ambiente gráfico), para quem usa um gerenciador de arquivos, também é possível acompanhar o progresso da transferência, com um nível mais elevado de exibição de informações.
elias praciano gnome nautilus
Na CLI, contudo, o comando cp, não permite obter este detalhamento do progresso da transferência dos seus arquivos.
mostrei como “atualizar” o comando cp, para forçar a exibição destas informações em outro post.
Neste, vou mostrar como obter o resultado com o utilitário pv.
Como não faz parte da instalação padrão da maioria das distribuições Linux, ele precisa ser instalado.
Por sorte, faz parte dos repositórios das grandes distribuições (Fedora, OpenSUSE, Debian, Ubuntu etc.)
Use o seu gerenciador de pacotes predileto para obtê-lo (yum, dnf, apt etc.)

Como funciona o pv

O pv é um utilitário para monitorar a transferência de dados.
Com ele, é possível obter informações sobre o percentual que ainda falta da tarefa a ser completada (com uma barra de progresso), o tempo de conclusão (estimado), a taxa de transferência, total de dados transferidos etc.
O pv é usado como pipeline (encanamento) entre dois processos.
Pode ser usado para monitorar o fluxo de dados local ou remotamente.
Eu sugiro o seu uso dentro de scripts, para dar retorno visual mais agradável sobre o progresso das atividades realizadas.

Exemplos de uso do pv

linux tranferencia de arquivo com comando pv
Para monitorar, enquanto faz a cópia de um arquivo, forneça a localização, o nome do arquivo de origem e do arquivo de destino:

pv origem > destino

Para copiar o arquivo-1.mp4 para dentro de um flash drive (montado no diretório Yellow), por exemplo:


pv arquivo-1.mp4 > /media/justincase/Yellow/arquivo-1.mp4

 355MiB 0:00:27 [1,36MiB/s] [=======================>          ] 73% ETA 0:00:09

No exemplo abaixo, o pv é usado para monitorar o backup dos diretórios apt/ e caching/:


tar -cjf - apt/ caching/ | (pv -p --timer --rate --bytes > backup.tar.bz)

34,5MiB 0:00:10 [2,79MiB/s] [        <=>  

Use o comando acompanhado da opção ‘-h’, para obter mais opções de uso:


pv -h


Se você está fazendo cópias de arquivos ou (des)compactando-os de dentro de um script, é possível dar um feedback visual mais atraente para o seu usuário, com o uso do comando pv.
Abaixo, um exemplo de backup do diretório ~/Documentos:


tar -czf - ~/Documentos/ | (pv -n > backup-docs.tgz) 2>&1 | dialog --gauge "Cópia de segurança do diretório Documentos" 10 70

backup whiptail
Se o utilitário whiptail não estiver presente no seu sistema, é possível usar o dialog.
No próximo exemplo, usamos o utilitário GUI, zenity:


tar -czf - ~/Documentos/ | (pv -n > backup-docs.tgz) 2>&1 | zenity --progress --text "Cópia de segurança do diretório Documentos"

backup zenity linux

Referências

https://www.tecmint.com/monitor-copy-backup-tar-progress-in-linux-using-pv-command/.

Como fazer cópias entre 2 hosts com o scp

Se você acessa pelo menos um servidor remoto via SSH, provavelmente terá utilidade para um comando de cópia, que permite trocar arquivos entre um host e outro — também através de uma conexão segura.
É isto que o comando scp faz: copia arquivos entre hosts, dentro de uma rede — com o uso do ssh, para transferência segura dos dados.
Durante o processo, o scp irá pedir a mesma senha que vocẽ usa para se autenticar via ssh — uma vez que ambos fazem parte do mesmo conjunto de ferramentas.

O comando scp, tal como o cp, irá sobrescrever arquivos no destino.
Portanto certifique-se de estar digitando a coisa certa e mantenha seus backups em dia.

Para este post, vou usar exemplos simples, em cima dos quais, você poderá construir procedimentos mais complexos, posteriormente.
Recentemente, configurei o .bashrc de uma máquina remota, para apresentar um prompt da linha comando personalizado — o que me ajuda a saber exatamente aonde estou realizando algum procedimento.
Como eu gostaria que a máquina local também tivesse um prompt customizado, pensei em usar o scp para copiar o arquivo .bashrc de lá para cá.
Tendo o nome do host remoto (tatooine, no meu caso) e sua respectiva senha, proceda assim:


scp justincase@tatooine:.bashrc ./

The authenticity of host 'tatooine (192.168.5.4)' can't be established.
RSA key fingerprint is 20:96:8d:4e:1c:d6:d5:40:e3:83:0a:f9:30:04:50:30.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'tatooine,192.168.5.4' (RSA) to the list of known hosts.
justincase@tatooine's password: 
.bashrc                                                                                           100%    0     0.0KB/s   00:00    

Na primeira conexão, as ferramentas ssh pedem confirmação (yes/no) — após o quê, a adicionam à lista de hosts conhecidos.
Você pode usar a opção ‘-r’ para copiar um diretório recursivamente, também:


scp -r justincase@tatooine:temporario/ temp/

justincase@tatooine's password:
error.log                    100% 5627     5.5KB/s   00:00     
error.log.0                  100% 6534     6.4KB/s   00:00     
error.log.2017-05-31.gz      100% 2086     2.0KB/s   00:00     
error.log.2017-06-01.gz      100% 1553     1.5KB/s   00:01     
error.log.2017-06-02.gz      100%  744     0.7KB/s   00:00     
error.log.2017-06-03         100% 7960     7.8KB/s   00:00     
error.log.2017-06-04         100% 6534     6.4KB/s   00:00     

Para copiar (ou subir) um arquivo local para um endereço remoto, use o seguinte exemplo:


scp -l 14 -C Downloads/piwigo-netinstall.php justincase@tatooine:~/

justincase@tatooine's password:
piwigo-netinstall.php                                                                      100%   15KB  14.9KB/s   00:00

No exemplo, acima, adicionei estas 2 opções:

  • -l 14 — que limita a banda em 14 Kbps. O que pode ajudar a não sobrecarregar a sua rede. Neste caso, como o arquivo tem 15 Kb, não houve diferença perceptível.
  • -C — aplica compressão ao(s) arquivo(s), em trânsito. Novamente, o comando é irrelevante para este caso (mas serve como exemplo), em virtude do tamanho ínfimo do arquivo copiado.

E se eu quiser copiar o mesmo arquivo entre dois hosts remotos — tatooine e coruscant?
A maneira mais simples de realizar este trabalho é copiando o arquivo objeto da transferência temporariamente para a máquina local — fazendo-a funcionar como intermediária da transação.
Veja como:


scp -3 jcase@tatooine:~/logs.txt jcase@coruscant:~/logs.txt


jcase@tatooine's password: jcase@coruscant's password:

Para realizar a cópia, o scp vai precisar que você forneça as senhas de cada um dos hosts.

Assinar blog por e-mail

Digite seu endereço de e-mail para assinar este blog e receber notificações de novas publicações por e-mail.

Como copiar arquivos aleatoriamente no Linux

Copiar ou mover uma quantidade de arquivos, de um diretório no seu sistema, para outro, em ordem aleatória, tem suas utilidades.
Se você tem uma pequena caixa de som, com entrada USB ou cartão SD e quer ouvir suas músicas em ordem aleatória, misturadas ao acaso, mas não tem o botão random ou shuffle no aparelho — a solução é garantir que as músicas já estejam em ordem aleatória no seu dispositivo de armazenamento.
Este problema é interessante e possui várias formas de ser resolvido, no GNU/Linux.
Vamos conhecer algumas.
Antes de começar, contudo, recomendo copiar todas as músicas que você pretende envolver no processo para um outro diretório e fazer a operação a partir dele. Se algo der errado, as chances de perder arquivos é menor.

Use o comando shuf no Linux

Se você tem o aplicativo shuf (shuffle, quer dizer embaralhar) instalado, pode resolver o problema com uma linha de comando simples.
No exemplo abaixo, as músicas estão todas juntas em uma pasta chamada ‘origem’. Serão copiadas para a pasta ‘destino’.

shuf -zen200 origem/* | xargs -0 mv -t destino

Explicando o comando shuf -zen200 — com seus 3 parâmetros:

  • -z — finaliza cada linha (da lista de arquivos que vai ser criada na memória) com um 0 byte
  • -e — trata cada argumento como uma nova linha input
  • -n200 — determina a quantidade de linhas a ser processada. Altere o valor para quantidade de arquivos presente no seu diretório

O utilitário xargs cria e executa a linha de comando a partir da saída fornecida pelo shuf.
De acordo com o manual do xargs, a opção ‘-0’ indica que os itens terminam com um caractere null (sem valor), em vez de espaços em branco e que os (eventuais) caracteres especiais (que compõem os nomes dos arquivos) não devem ser tratados como especiais e devem ser entendidos literalmente.
Por último, a opção ‘-t’, do comando mv, indica que o nome que o segue é nome de diretório e não nome de arquivo comum.
Se você quiser ver a ação acontendo, use ‘-vt’, assim:

shuf -zen200 origem/* | xargs -0 mv -vt destino

Outra alteração que você pode fazer é substituir o comando mv (mover) por cp (copiar):

shuf -zen200 origem/* | xargs -0 cp -vt destino

Para ver os arquivos copiados, no destino, use o comando ls -tlr — com estes parâmetros, o comando ls mostra os arquivos na ordem em que foram gravados.

Lista de arquivos mp3
Clique para ver detalhes.

Use o comando find para listar, embaralhar e copiar arquivos de um diretório para outro

Uma solução equivalente envolve o comando find.
Um pouco mais complexa, porém mais flexível é voltada para usuários mais avançados.
Com esta opção é possível entrar recursivamente nos diretórios em busca de arquivos e transferi-los para dentro de outro diretório ou dispositivo de armazenamento, “totalmente desorganizados”, do jeito que eu quero.
Veja como funciona:

find origem -type f -print0 | sort -Rz | cut -d $'\0' -f-200 | xargs -0 cp -nvt destino

Se você quiser entender melhor o comando find, leia alguns artigos que contém exemplos dele.

Como renomear os arquivos aletoriamente

O que resta saber, agora, é se o seu mp3 player “físico” toca os arquivos na ordem em que se encontram na mídia de armazenamento ou se os toca em ordem alfabética (ou qualquer outra).
No meu caso, os arquivos são tocados na ordem em que foram gravados.
Se este não for o seu caso e se seus arquivos seguem o padrão de ter em seus nomes a identificação do cantor/banda etc. tudo o que fizemos até aqui, provavelmente terá sido inútil.
O meu player (velhinho) não exibe no visor o nome do arquivo que está tocando.
Esta característica torna os nomes dos arquivos irrelevantes, quando conecto uma mídia de armazenamento nele.
Portanto, se eu renomear todos os meus arquivos mp3 aleatoriamente, vou obter o mesmo resultado: tocá-los aleatoriamente.
A linha de comando, que segue, altera os nomes de arquivos usando o sha1sum, para gerar códigos aleatórios.
Recomendo copiar seus arquivos para um diretório temporário antes de executar o próximo comando — uma vez que ele impossibilitará saber “quem é quem” no diretório, depois que alterar todos os nomes (veja o resultado, na imagem abaixo).
nomes de arquivos aleatórios
Entre no diretório contendo seus arquivos e execute o seguinte:

for fname in *.mp3; do mv -v "$fname" $(echo "$fname" | sha1sum | cut -f1 -d' ').mp3; done

Agora copie os arquivos pro pendrive ou cartão SD e veja se funcionou!

Referência: http://unix.stackexchange.com/questions/38335/best-method-to-collect-a-random-sample-from-a-collection-of-files