Script Bash: copier de nouvelles images de la SD vers le PC

Parfois, nous devons effectuer des tâches répétitives sur notre PC, qui avec le temps deviennent fastidieuses. Dans certains cas, nous pouvons faciliter notre travail en utilisant des scripts qui fonctionnent pour nous.

Aujourd'hui, je vous écris pour vous montrer un script bash qui a résolu un besoin: copier de nouvelles images de mon appareil photo numérique d'une carte SD vers le PC.

Situation:

Chaque fois que j'avais de nouvelles images à télécharger sur mon ordinateur, je faisais ce qui suit:

1. Ouvrez le répertoire où j'ai les images classées dans des sous-répertoires.

2. Créez un nouveau sous-répertoire avec le nom de la date actuelle, au format aa.mm.jj

3. Accédez au sous-répertoire créé la fois précédente et voyez quelle est la dernière image enregistrée.

4. Copiez les nouvelles images de la carte SD dans le répertoire nouvellement créé.

Cela ne prend pas plus d'une minute, mais il est plus facile pour le processus d'être effectué en insérant simplement la carte.

Je dois utiliser la carte car je ne peux pas transférer directement les images de la caméra via USB, car il n'y a pas de pilotes Linux (comme toujours ...)

solution:

Créez un script bash qui effectue les opérations suivantes:

1. Vérifiez au démarrage si la carte SD est montée. Sinon, ça se termine.

2. Allez dans le répertoire principal des images et trouvez le dernier. Enregistrez votre nom dans une variable.

3. Comparez la date actuelle avec le dernier répertoire, s'ils diffèrent, créez un nouveau répertoire avec le nom de la date actuelle au format "aa.mm.jj".

4. Déplacez-vous vers le dernier répertoire (pas le nouveau, mais un plus ancien) et enregistrez dans une variable le nom du dernier fichier transféré la fois précédente.

Dans cette étape, il est nécessaire de filtrer le nom du fichier pour pouvoir le comparer avec les nouveaux fichiers sur la carte dans un proche avenir. Les fichiers ont le format suivant: xxx_xxxx.eee Où: x = chiffres 0 à 9 et eee = extension (JPG, MOV). Par exemple: 100_5684.JPG, 100_5699.MOV. Après le filtre, le nom reste xxxxxxx Par conséquent, dans l'exemple ci-dessus, nous aurions: 1005684, 1005699.

Étant donné que le répertoire peut contenir d'autres types de fichiers ou avec des noms modifiés, le filtre est utilisé.

5. Accédez à la carte et filtrez les fichiers comme au point précédent.

6. Comparez les fichiers sur la carte avec la variable qui contient le dernier fichier transféré la fois précédente (point 4) et copiez les fichiers nommés dans le répertoire nouvellement créé supérieur à la variable. (puisque les noms ne sont que des nombres).

7. Ouvrez le répertoire contenant les nouvelles images avec le gestionnaire de fichiers.

Ensuite, je vous montre le script avec des commentaires qui expliquent son fonctionnement. Je précise que je ne suis pas un programmeur et cela m'a donné plusieurs maux de tête jusqu'à ce que je le fasse fonctionner, surtout quand je devais filtrer les noms pour la boucle "for".

#! / bin / bash ### --- VERIFIER SI LA SD EST MONTE --- ### SD = / media / KODAK / DCIM / 100Z8612 if [[-d $ SD]]; puis ### --- CREATE DIRECTORY --- ### #Lire le répertoire des images et en créer un autre avec le nom de la # date actuelle et les permissions 755 s'il n'existe pas. cd ~ / Images / kodak ULTDIR = `ls -1 | tail -n1` # dernier répertoire de la liste. DATE = `date +% y.% M.% D` #Date actuelle au format AA.MM.DD si [" $ LASTDIR "! =" $ DATE "]; then mkdir -vm 755`date +% y.% m.% d` # créer le répertoire avec la date actuelle fi ### --- VOIR LE DERNIER FICHIER 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` # voir la dernière image avec le nom xxx_XXXX.eee .eee = extension de fichier (JPG ou MOV) # Pour s'assurer que le script fonctionne une fois qu'il est exécuté: # 100_9999.eee -> 101_0000. eee et il n'y a pas d'erreurs # CUT pour qu'il soit au format xxxXXXX ### --- ALLER AU DERNIER RÉPERTOIRE DE LA LISTE --- ### # OU AU RÉCEMMENT CRÉÉ, SI # cd a été CRÉÉ .. ULTDIR = `ls -1 | tail -n1` # recommence car sinon il prend l'ULTDIR précédent du if cd / media / KODAK / DCIM / 100Z8612 ### --- FILTRE les fichiers en SD --- ### FILTER = `ls -1 [ 0 -9] [0-9] [0-9] _ [0-9] [0-9] [0-9] [0-9]. [JM] [PO] [GV] `### - - COMPAREZ DE NOUVEAUX FICHIERS AVEC UN NOM PLUS GRAND QUE LE DERNIER --- ### for I in $ FILTER do N = `echo $ I | cut -c1-3,5-8` #Cut nom if [["$ ULTIMG" -lt "$ N"]]; then cp $ I ~ / Pictures / kodak / $ ULTDIR fi done thunar ~ / Pictures / kodak / $ ULTDIR #Ouvrir le nouveau répertoire avec Thunar else exit 0 fi exit 0

Enfin pour le faire fonctionner, je l'ai ajouté à l'application Xfce "Removable Drives and Media" dans le menu

Paramètres → Gestionnaire de paramètres Xfce 4 → Lecteurs et supports amovibles → Caméras

en utilisant l'option d'importation d'image. Lorsque j'insère la carte, une boîte de dialogue me demande si je veux importer les images. Lors de l'acceptation, le script est exécuté.

Eh bien c'est ça. Désolé pour le désordre du texte, c'est mon premier message et je ne sais pas comment tabuler le script lors de son édition. J'espère qu'il est utile à quelqu'un au moins d'avoir une idée et de l'adapter à chaque cas particulier.

Je n'ai pas obtenu de licence car je ne me suis pas bien renseigné sur chaque version de la GPL, mais ils sont libres de la copier et de la modifier. Et n'hésitez pas à dire comment cela pourrait être amélioré ou s'il existe d'autres moyens de faire de même, mais plus faciles.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont marqués avec *

*

*

  1. Responsable des données: Miguel Ángel Gatón
  2. Finalité des données: Contrôle du SPAM, gestion des commentaires.
  3. Légitimation: votre consentement
  4. Communication des données: Les données ne seront pas communiquées à des tiers sauf obligation légale.
  5. Stockage des données: base de données hébergée par Occentus Networks (EU)
  6. Droits: à tout moment, vous pouvez limiter, récupérer et supprimer vos informations.

  1.   Percaff_TI99 dit

    Très intéressant Joaquín, une bonne idée est de télécharger le script dans la pâte où il est plus facile de partager le code, et comme tu le dis, il peut être adapté à d'autres besoins et on apprend à utiliser un peu plus bash.

    Salutations!

    1.    Joaquin dit

      Terminé, ajouté dans http://paste.desdelinux.net/4737
      Merci!

  2.   vr_rv dit

    Lorsque vous copiez une photo qui est déjà dans le répertoire, cela n'indique pas qu'il y en a déjà une et vous donne la possibilité de la remplacer ou de ne pas la copier?

    Quoi qu'il en soit, c'est très utile, car il fait tout automatiquement

    1.    Joaquin dit

      Salut. Il ne copie pas réellement les images répétées, il les ignore simplement. L'idée était précisément de copier les nouveaux fichiers sans avoir besoin d'interaction avec l'utilisateur. De plus, sauf si vous ajoutez des images plus d'une fois par jour, le script copie les nouveaux fichiers dans un nouveau répertoire. J'explique brièvement:

      Aujourd'hui, nous sommes le 10/03/13, je crée un répertoire appelé 13.03.10/100/4440 et copie quelques images ou vidéos (MOV) à l'intérieur: 100_4441.JPG, 100_4442.JPG, 100_4445.MOV, XNUMX_XNUMX.JPG
      (Les 4443 et 4444 manquants ont été effacés avec l'appareil photo, le dernier est le 4445).

      Supposons alors que j'utilise le script le 01/04/13 et que j'aie de nouvelles images sur la carte. Le script crée un répertoire appelé 13.04.01 et à l'intérieur des nouvelles images / vidéos dont le nom est supérieur à "4445"; car il lit le répertoire 13.03.10 et la dernière image est 100_4445.JPG. Si je relance le script avec de nouvelles images de la carte le même jour, elles sont ajoutées au répertoire 13.04.01. Aucun n'est écrasé.

      J'espère avoir clarifié un peu mon idée 🙂

  3.   Manuti dit

    Et vous ne connaissez pas Rapid Photo Downloader? Je pense qu'il fait tout cela et plus encore.

    1.    Mr Black dit

      Le fait est que l'homme maigre l'a fait lui-même, il se serait amusé je suppose et ça peut servir quelqu'un d'autre

    2.    Joaquin dit

      Salut. Je ne le savais pas et cela semble bon d'après ce que j'ai vu sur Internet, mais en fait le script répond parfaitement à ce dont j'ai besoin; qui consiste à insérer la carte et à copier automatiquement tous les fichiers.

      Cela m'a aussi aidé à en apprendre un peu plus parce que, de toute évidence, cela n'a pas fonctionné la première fois; Des erreurs se sont produites et on en apprend beaucoup.

      Je n'avais pas l'intention de montrer le script pour résoudre des problèmes pour d'autres, il y a des applications comme celles que vous mentionnez qui sont plus générales. Je l'ai partagé pour que vous puissiez le lire et comme référence pour créer de nouvelles choses en utilisant des boucles (dans ce cas "pour") et des expressions régulières (variables "ULTIMG" et "FILTER" dans le script)

  4.   labo de code dit

    Cela me semble utile, je le garde au cas où j'en aurais besoin un jour. Je vous remercie.

    1.    Joaquin dit

      Merci!

  5.   non nommé dit

    mais pour ça on a déjà grsync

    1.    Joaquin dit

      Oui, mais je pense que rsync est davantage utilisé pour les sauvegardes. Je ne l'ai jamais regardé mais c'est une application que nous devrions prendre en compte et apprendre de nous tous.

      Je ne savais pas qu'il y avait une interface graphique pour rsync.

  6.   derniernouveau dit

    Wow, je trouve le code très intéressant, très utile. continue comme ça. 😀
    Je le garderai au cas où j'en aurais besoin.

    Salutations.

    1.    Joaquin dit

      Je vous remercie!.