Script bash: copie novas imagens do SD para o PC

Às vezes, precisamos realizar tarefas repetitivas em nosso PC, que com o tempo se tornam tediosas. Em certos casos, podemos facilitar nosso trabalho fazendo uso de scripts que funcionam para nós.

Hoje estou escrevendo para mostrar a vocês um script bash que resolveu uma necessidade: copiar novas imagens da minha câmera digital de um cartão SD para o PC.

Localização:

Sempre que eu tinha novas imagens para baixar no meu computador, eu fazia o seguinte:

1. Abra o diretório onde tenho as imagens classificadas em subdiretórios.

2. Crie um novo subdiretório com o nome da data atual, no formato aa.mm.dd

3. Vá para o subdiretório criado na vez anterior e veja qual é a última imagem salva.

4. Copie as novas imagens do cartão SD para o diretório recém-criado.

Isso não leva mais de um minuto, mas é mais fácil para o processo ser feito apenas inserindo o cartão.

Tenho que usar o cartão porque não consigo transferir as imagens diretamente da câmera via USB, pois não há drivers para Linux (como sempre acontece ...)

solução:

Crie um script bash que faça o seguinte:

1. Verifique na inicialização se o cartão SD está montado. Caso contrário, termina.

2. Vá para o diretório principal de imagens e encontre a última. Salve seu nome em uma variável.

3. Compare a data atual com o último diretório, se forem diferentes, crie um novo diretório com o nome da data atual no formato "aa.mm.dd".

4. Vá para o último diretório (não o novo, mas um mais antigo) e salve em uma variável o nome do último arquivo transferido na vez anterior.

Nesta etapa, é necessário filtrar o nome do arquivo para poder compará-lo com os novos arquivos do cartão em um futuro próximo. Os arquivos têm o seguinte formato: xxx_xxxx.ee Onde: x = dígito 0 a 9 e eee = extensão (JPG, MOV). Por exemplo: 100_5684.JPG, 100_5699.MOV. Após o filtro, o nome permanece xxxxxxx Portanto, no exemplo acima, teríamos: 1005684, 1005699.

Como o diretório pode conter outros tipos de arquivos ou com nomes alterados, o filtro é usado.

5. Mova para o cartão e filtre os arquivos como no ponto anterior.

6. Compare os arquivos no cartão com a variável que contém o último arquivo transferido na vez anterior (ponto 4) e copie os arquivos nomeados para o diretório recém-criado maior do que a variável. (já que os nomes são apenas números).

7. Abra o diretório que contém as novas imagens com o gerenciador de arquivos.

Em seguida, mostro o script com comentários que explicam como funciona. Esclareço que não sou um programador e isso me deu várias dores de cabeça até que o fizesse funcionar, especialmente quando tive que filtrar os nomes para o loop "for".

#! / bin / bash ### --- VERIFICAR SE O SD ESTÁ MONTADO --- ### SD = / media / KODAK / DCIM / 100Z8612 if [[-d $ SD]]; então ### --- CRIAR DIRETÓRIO --- ### #Leia o diretório de imagens e crie outro com o nome da # data atual e permissões 755 se ele não existir. cd ~ / Pictures / kodak ULTDIR = `ls -1 | tail -n1` # último diretório da lista. DATE = `data +% y.% M.% D` #Data atual no formato AA.MM.DD if [" $ LASTDIR "! =" $ DATE "]; então mkdir -vm 755`data +% y.% m.% d` # criar diretório com a data atual fi ### --- VER ÚLTIMO ARQUIVO DE $ ULTDIR --- ### cd $ ULTDIR ULTIMG = `ls - 1 [0-9] [0-9] [0-9] _ [0-9] [0-9] [0-9] [0-9]. [JM] [PO] [GV] | tail -n1 | cut -c1-3,5-8` # veja a última imagem com o nome xxx_XXXX.eee .eee = extensão de arquivo (JPG ou MOV) # Para garantir que o script funcione após ser executado: # 100_9999.eee -> 101_0000. eee e não há erros # CORTAR para que fique no formato xxxXXXX ### --- MOVER PARA O ÚLTIMO DIRETÓRIO DA LISTA --- ### # OU PARA O RECENTEMENTE CRIADO, SE # cd foi CRIADO .. ULTDIR = `ls -1 | tail -n1` # vai novamente porque caso contrário leva o ULTDIR anterior de if cd / media / KODAK / DCIM / 100Z8612 ### --- FILTER os arquivos em SD --- ### FILTER = `ls -1 [ 0 -9] [0-9] [0-9] _ [0-9] [0-9] [0-9] [0-9]. [JM] [PO] [GV] `### - - COMPARAR NOVOS ARQUIVOS COM NOME MAIOR DO QUE O ÚLTIMO --- ### para I em $ FILTER do N = `echo $ I | cut -c1-3,5-8` #Nome do corte if [["$ ULTIMG" -lt "$ N"]]; então cp $ I ~ / Pictures / kodak / $ ULTDIR fi done thunar ~ / Pictures / kodak / $ ULTDIR #Abra o novo diretório com Thunar else exit 0 fi exit 0

Finalmente, para fazê-lo funcionar, adicionei-o ao aplicativo "Drives e mídia removíveis" do Xfce no menu

Configurações → Gerenciador de configurações do Xfce 4 → Mídia e unidades removíveis → Câmeras

usando a opção de importação de imagem. Quando insiro o cartão, uma caixa de diálogo pergunta se desejo importar as imagens. Ao aceitar, o script é executado.

Bem, é isso. Desculpem a bagunça do texto, é meu primeiro post e não sei tabular o script na hora de editá-lo. Espero que seja útil a alguém pelo menos ter uma ideia e adaptá-la a cada caso particular.

Não licenciei porque não me informei bem sobre cada versão da GPL, mas eles têm a liberdade de copiá-la e modificá-la. E fique à vontade para dizer como poderia ser melhorado ou se existem outras maneiras de fazer o mesmo, mas mais fácil.

Deixe um comentário

Seu endereço de email não será publicado. Campos obrigatórios são marcados com *

*

*

  1. Responsável pelos dados: Miguel Ángel Gatón
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.

  1.   Percaff_TI99 dito

    Muito interessante Joaquín, uma boa ideia é fazer upload do script na pasta onde é mais fácil compartilhar o código, e como você diz pode ser adaptado a outras necessidades e se aprende um pouco mais a usar o bash.

    Saudações !!!

    1.    Joaquin dito

      Concluído, adicionado em http://paste.desdelinux.net/4737
      Thanks!

  2.   vr_rv dito

    Ao copiar uma fotografia que já está no diretório, não indica que já existe e dá a opção de substituí-la ou não copiá-la?

    De qualquer forma é muito útil, pois faz tudo automaticamente

    1.    Joaquin dito

      Oi. Na verdade, ele não copia imagens repetidas, apenas as ignora. A ideia era justamente copiar os novos arquivos sem a necessidade de interação do usuário. Além disso, a menos que você adicione imagens mais de uma vez por dia, o script copia os novos arquivos para um novo diretório. Eu explico brevemente:

      Hoje é 10/03/13, crio um diretório chamado 13.03.10/100/4440 e copio algumas imagens ou vídeos (MOV) dentro: 100_4441.JPG, 100_4442.JPG, 100_4445.MOV, XNUMX_XNUMX.JPG
      (Os 4443 e 4444 ausentes foram apagados com a câmera, o último é 4445).

      Então, suponha que eu use o script em 01/04/13 e tenha novas imagens no cartão. O script cria um diretório chamado 13.04.01 e dentro das novas imagens / vídeos cujo nome é maior que "4445"; porque ele lê o diretório 13.03.10 e a última imagem é 100_4445.JPG. Se eu executar novamente o script com novas imagens do cartão no mesmo dia, elas serão adicionadas ao diretório 13.04.01. Nenhum é sobrescrito.

      Espero ter esclarecido um pouco minha ideia 🙂

  3.   Manuti dito

    E você não conhece o Rapid Photo Downloader? Acho que faz tudo isso e muito mais.

    1.    Mr Black dito

      O que quero dizer é que o homem magrinho fez isso sozinho, ele teria se divertido, eu acho, e isso pode servir a outra pessoa

    2.    Joaquin dito

      Oi. Não sabia e parece bom pelo que vi na internet, mas na verdade o script cumpre perfeitamente o que preciso; que é inserir o cartão e ter todos os arquivos copiados automaticamente.

      Também me ajudou a aprender um pouco mais porque obviamente não funcionou da primeira vez; Erros ocorreram e muito se aprendeu com eles.

      Não pretendia mostrar o script para resolver problemas de outras pessoas, existem aplicativos como os que você mencionou que são mais gerais. Eu compartilhei para você ler e como referência para criar coisas novas usando loops (neste caso "para") e expressões regulares (variáveis ​​"ULTIMG" e "FILTER" no script)

  4.   codelab dito

    Parece útil, guardo para o caso de precisar um dia. Obrigado.

    1.    Joaquin dito

      Thanks!

  5.   sem nome dito

    mas para isso já temos o grsync

    1.    Joaquin dito

      Sim, mas acho que o rsync é mais usado para backups. Nunca o vi, mas é um aplicativo que devemos levar em consideração e aprender com todos nós.

      Eu não sabia que havia uma interface gráfica para rsync.

  6.   último novato dito

    Nossa, acho o código muito interessante, muito útil. continue assim. 😀
    Vou guardá-lo para o caso de precisar.

    Saudações.

    1.    Joaquin dito

      Obrigado!.