Forum Linux.debian/ubuntu bash recuperer nom de plusieurs fichiers incrémentés

Posté par . Licence CC by-sa.
Tags :
0
11
fév.
2019

Bonjour à tous,

Dans une boucle de stacking de plusieurs images, J'aimerai récupérer la première partie du nom -identique- de 2 fichiers, puis l'incrément qui suit

  fichiers

    dossier/toto1.png
    dossier/toto2.png

j'aimerai
récupérer "toto" puis [12] à la suite…

j'ai fait

    for i in dossier/*
    do echo $basename $i .${##*.})
    done

cela affiche bien les fichiers en entier

    toto1
    toto2

…mais je voudrai séparer la partie invariable "toto" et les deux incréments dans [12] dans uen chaine "toto[12]"

merci beaucoup!
cat

  • # plusieurs moyens

    Posté par . Évalué à 2.

    1°) supprimer les chiffres
    si tes noms de fichiers sont toujours de la forme abcdef12345.ext
    un simple recherche/remplace dans le nom obtenu precedemment, en supprimant les chiffres te donnera ta racine 'toto'

    2°) si tu fais cela pour chaque fichier, tu as donc une "racine" = toto
    et un compteur 1 sur le premier fichier
    au deuxieme tour, la racine est la meme, donc tu n'en changes pas, et le compteur devient 12 (concatenation du compteur precedent et du nouveau compteur)

    nouveaucompteur=[un truc qui supprime la $racine dans la chaine du nom de fichier]
    compteur=${compteur}${nouveaucompteur}`
  • # un petit script

    Posté par . Évalué à 1. Dernière modification le 11/02/19 à 16:59.

    #!/bin/bash
    
    nomIdentique="toto"                       # La partie identique du nom des fichiers
    maRegex="$nomIdentique([0-9]).png$"       # Pour extraire le chiffre situé juste avant ".png"
    chiffres=""                               # Pour la liste des chiffres qui seront extraits
    
    tablFichs=( dossier/$nomIdentique*.png )  # Mise dans un tableau de la liste
    for fich in "${tablFichs[@]}"; do
        fich="${fich##*\/}"                   # Suppression du nom du chemin   
        [[ "$fich" =~ $maRegex ]] && chiffres="$chiffres${BASH_REMATCH[1]}"
    done
    
    echo "$nomIdentique[$chiffres]"
  • # ou alors…

    Posté par . Évalué à 1.

    #!/bin/bash
    
    extension=".png"
    nomRepertoire="dossier"
    
    tmpIFS="$IFS"; IFS=$'\n'
    
    tablFichs=( "$nomRepertoire/"*"$extension" )
    tablFichs=( ${tablFichs[@]##*\/} )
    
    maRegex='[0-9][0-9]*'"$extension"'$'
    tablUniqs=($( \
    for fich in "${tablFichs[@]}"; do
        [[ "$fich" =~ ($maRegex) ]] && \
            printf "%s\n" "${fich//${BASH_REMATCH[1]}/}"
    done | sort -u
    ))
    
    for debutNom in "${tablUniqs[@]}"; do
        chiffres=""
        for fich in "${tablFichs[@]}"; do
            [[ "$fich" =~ "$debutNom"(.*) ]] && \
                chiffres+="${BASH_REMATCH[1]//$extension}"
        done
        printf "%s\n" "$nomRepertoire/$debutNom[$chiffres]"
    done
    
    IFS=$tmpIFS
    • [^] # message à supprimer

      Posté par . Évalué à 1. Dernière modification le 12/02/19 à 07:24.

      désolé

    • [^] # Re: celui-ci devrait mieux fonctionner

      Posté par . Évalué à 1. Dernière modification le 12/02/19 à 07:37.

      Le contenu de monScript.sh :

      #!/bin/bash
      
      extension="png"                 # Le nom d'extension SANS le point qui la précède
      nomRepert="/nom/du/répertoire"  # …dans lequel se trouvent les fichiers à traiter
      
      tablFichs=( "$nomRepert/"*"$extension" )
      tablFichs=( "${tablFichs[@]##*\/}" )
      
      tmpIFS="$IFS"
      IFS=$'\n'
      maRegex='([0-9]{1,}\.'"$extension"')$'
      tablUniqs=($( \
      for fich in "${tablFichs[@]}"; do
          [[ "$fich" =~ $maRegex ]] && \
              printf "%s\n" "${fich//${BASH_REMATCH[1]}/}"
      done | sort -u
      ))
      
      for debutNom in "${tablUniqs[@]}"; do
          chiffres=""
          maRegex="^$debutNom"'([0-9]{1,})\.'"$extension"
          for fich in "${tablFichs[@]}"; do
              [[ "$fich" =~ $maRegex ]] && \
                  chiffres+="${BASH_REMATCH[1]}"$'\n'
          done
          chiffres="$(sort -n <<< $chiffres | tr '\n' ',')"
          printf "%s\n" "$debutNom[${chiffres:1:-1}]"
      done
      IFS="$tmpIFS"

      La liste des noms des fichiers pour le test :

      autrefichier_4.png
      autrefichier_5.png
      avec espace1.png
      avec espace2.png
      avec espace3.png
      fic77.pnget445.png
      fich77a7888.png
      fich77a7.png
      fichier42.png
      un77autre_0.png
      un77autre_3.png
      unautre_055.png
      unautre_155.png
      unautre_50.png
      unautre_56.png

      Le retour du script en fonction de la liste ci-dessus :

      autrefichier_[4,5]
      avec espace[1,2,3]
      fic77.pnget[445]
      fich77a[7,7888]
      fichier[42]
      un77autre_[0,3]
      unautre_[50,055,56,155]

Suivre le flux des commentaires

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