Forum Linux.général Commande de suppression par analogie de nom.

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
2
7
avr.
2019

Bonjour,

Je prends des photos en deux formats : JPG et ARW.
Parfois, j'ai plusieurs centaines de photos à trier.
Les noms des fichiers s'écrivent ainsi : DSC0120.JPG DSC0120.ARW
Je trie les fichiers JPG (plus légers) et, ensuite, j'aimerais ne conserver que les fichiers JPG et ARW qui m'intéressent, plutôt qu'effacer les fichiers JPG indésirables et avoir toujours les fichiers ARW correspondant (qui sont les mêmes photos, mais dans un autre format), j'aimerais un moyen pour effacer aussi les ARW dont les fichiers JPG analogues ne m'intéressent pas.

Pour l'instant, je crée un dossier avec toutes les photos JPG à effacer, puis, je liste tous les fichiers dans un fichier texte, fichier dans lequel, avec sed, je remplace toutes les extensions JPG par ARW, puis, un simple rm $(<liste_indésirables)…enfin, j'efface les JPG que j'avais mis de côté.

Il y a peut-être une solution plus simple ou plus propre ? Merci !

  • # Boucle for et substitution

    Posté par  (site web personnel) . Évalué à 6.

    # $f va prendre successivement toutes les valeurs correspondant aux fichiers *.ARW dans le répertoire courant
    for f in *.ARW           
    do
            # ${f%.ARW} = contenu de f, en ayant supprimé le suffixe .ARW
            echo ${f%.ARW}.JPG
    done
    

    Plus qu'à remplacer la commande echo par autre chose, mais il vaut mieux tester avec echo d'abord ;-).

  • # contradiction

    Posté par  . Évalué à 3.

    j'aimerais ne conserver que les fichiers JPG et ARW qui m'intéressent,
    […]
    j'aimerais un moyen pour effacer aussi les ARW dont les fichiers JPG analogues ne m'intéressent pas.

    1) faire une liste des fichiers qui t'interessent (ou qui ne t'interessent pas), dans un dossier comme tu le fais actuellement

    2) avec l'exemple ci-dessus, parcourir ce dossier pour selectionner les fichier RAW qui vont avec

    3) faire l'action qui va bien (suppression si c'est une liste qui ne t'interesse pas, deplacement si c'est une liste qui t'interesse)

    autre piste, avec ton visualeur d'image, tu supprimes les JPG qui ne te plaise pas.

    puis tu contruis ta boucle pour supprimer les RAW qui n'ont pas de JPG correspondant

    • [^] # Re: contradiction

      Posté par  . Évalué à 1.

      Ce n'est pas une contradiction ?

      fichier1.JPG, fichier1.ARW, fichier2.JPG, fichier2.ARW

      Si le fichier fichier2.JPG ne m'intéresse pas, je veux pouvoir effacer celui-ci et fichier2.ARW en même temps, ou en tout cas, facilement. :)

      Merci en tout cas ! :)

      • [^] # Re: contradiction

        Posté par  . Évalué à 3.

        du coup tu as trouvé entre mon idée et le code fournit plus haut ?

        tu peux faire une boucle qui fait

        pour chaque fichier ARW
        recupere son nom sans le ARW
        si tu n'as pas le JPG associé
        alors supprime le fichier ARW
        finsi
        finpour

        à traduire dans le langage que tu veux

        • [^] # Re: contradiction

          Posté par  . Évalué à 1.

          Ce sera en bash, de toute façon. Mais l'idée est bonne. J'y travaille pour avoir quelque chose de propre. :)

  • # Peut-être avec ce script bash

    Posté par  . Évalué à 3.

    Bonjour

    #!/bin/bash
    
    if [ $# -gt 0 ]; then   # S'il y a des arguments qui suivent la commande
        args=("$@")           # Créer un tableau avec la liste de ces arguments
        for fich in "${args[@]}"; do   # Pour chacun de ces arguments
            if [ -e "$fich" ] && [ "${fich##*.}" = "JPG" ]; then  # Si cet argument est un nom de fichier existant
                                                                  # - et que son nom d'extension est bien ".JPG"
                rm "$fich"                                          # Alors supprimer le fichier
                if [ -e "${fich%.*}.ARW" ]; then                    # Si il existe un fichier du même nom
                                                                    # - dont le nom d'extension est ".ARW"
                    rm "${fich%.*}.ARW"                               # Alors supprimer ce fichier
                fi
            fi
        done
    fi
    • [^] # Re: Peut-être avec ce script bash

      Posté par  . Évalué à 3. Dernière modification le 07 avril 2019 à 15:17.

      sauf que là tu lui fais effacer les JPG et les RAW s'ils existent.

      lui il veut selectionner ces fichiers à garder (ou à supprimer)
      pour garder les JPG et les RAW de la premiere selection (ou supprimer les RAW des JPG qui n'existent plus)

      • [^] # Re: Peut-être avec ce script bash

        Posté par  . Évalué à 1. Dernière modification le 07 avril 2019 à 16:35.

        …sauf que là tu lui fais effacer les JPG et les RAW s'ils existent.…

        Non, je ne lui fais rien effacer du tout :

        Dans la ligne de commande qui lancera le script,
        s'il ne donne aucun nom de fichier dont le nom d'extension serait .JPG
        aucun fichier ne sera supprimé.

        D'autre part, quoi qu'il donne comme argument dans la ligne de commande lançant ce script,
        aucun fichier dont le nom d'extension serait .RAW
        ne sera supprimé ou modifié ou effacé.

        • [^] # Re: Peut-être avec ce script bash

          Posté par  . Évalué à 4.

          pourtant ton script dit

          si l'argument est un fichier qui existe et que c'est un JPG
          alors
          supprime ce fichier
          s'il existe un fichier.ARW
          alors
          supprime ce fichier
          finsi
          finsi

          donc si dans son dossier il a des fichier1.JPG fichier1.ARW fichier2.JPG fichier2.ARW
          et qu'il dit à son script

          script.sh fichier1.JPG

          ca supprime le fichier1.JPG et le fichier1.ARW

          ce qu'il veut c'est pouvoir selectionner les fichiers à supprimer (en les envoyant dans un dossier à part par exemple, voire en les supprimant reellement),
          puis supprimer les fichiers ARW correspondants (ou orphelin si la version JPG n'existe plus)

    • [^] # Re: Peut-être avec ce script bash

      Posté par  (site web personnel) . Évalué à 5.

      Les trois premières lignes sont bien alambiquées, alors que ceci ferait l'affaire (et fonctionnerait quel que soit le shell)…

      for fich in "$@"; do
      

      Debian Consultant @ DEBAMAX

      • [^] # Re: Peut-être avec ce script bash

        Posté par  . Évalué à 3.

        Effectivement, ça simplifierait les choses
        Ce qui donnerait :

        #!/bin/bash
        
        for fich in "$@"; do
            if [ -e "$fich" -a "${fich##*.}" = "JPG" ]; then
                rm "$fich"
                if [ -e "${fich%.*}.ARW" ]; then
                    rm "${fich%.*}.ARW"
                fi
            fi
        done

        (J'en ai profité pour reformuler la ligne du premier if
        en utilisant un -a plutôt que le &&)

    • [^] # Re: Peut-être avec ce script bash

      Posté par  . Évalué à 1.

      Merci pour la piste ! Ça me permet de travailler mes scripts (tout à fait amateurs) et ça fluidifie mon travail. Merci ! :)

  • # Autre approche

    Posté par  (site web personnel) . Évalué à 5.

    Je pense que l'approche d'effacer n'est pas la meilleure, il vaudrait mieux déplacer les fichiers ARW dans le même dossier que les fichiers JPEG qui leur correspondent. L'intérêt est que c'est une fonction qui a son utilité en soit, et qu'elle résout le problème: il suffit de déplacer les fichiers JPEG qu'on ne veut pas dans un dossier spécial, d'e faire suivre les fichiers ARW puis des procéder à l'effacement.

    La logique serait, étant donné SRCDIR (dossier où étaient tous les fichiers) et TARGETDIR (fichier d'arrivée):

    • On examine TARGETDIR et con construit la liste de tous les fichiers JPG qui n'ont pas le fichier ARW correspondant.
    • On examine SRCDIR à la recherche des ces fichiers, lorsqu'ils existent on les déplace à côté du fichier JPG et dans le cas contraire on afficher un avertissement.

    Des points bonus pour l'écriture d'un fichier “undo”, un shell script qui permet d'annuler la dernière opération! :-)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.