Linux Renommage / tronquage nom de fichiers

Résolu
diego92 Messages postés 14 Statut Membre -  
diego92 Messages postés 14 Statut Membre -
Bonjour à tous,

je souhaite écrire un script de renommage de fichiers mais je n'y arrive pas.

Mon problème :

Dans un répertoire se trouve des fichiers de type :

ABCDEF_blablablablablablabla.extension

Comment faire pour les renommer en ne gardant que les 6 premiers caractères ABCDEF + l'extension ? ABCDEF.extensionn

Merci d'avance pour vos lumières !

18 réponses

Résumé de la discussion

Renommer des fichiers pour ne conserver que les six premiers caractères et l’extension présente une problématique fréquente dans les scripts à automatiser transformer ABCDEF_blablablablablablabla.extension en ABCDEF.extension. Plusieurs solutions reposent sur des outils courants, notamment une expression régulière avec rename, un script shell avec for et mv, ou des expansions de paramètres Bash pour extraire le préfixe et l’extension. Des variantes POSIX et Bash existent, par exemple ${f:0:6}.${f##*.} ou ${f%%_*}.${f##*.}, et certains répondants signalent des limites selon le shell, notamment sur AIX ou lorsque les noms contiennent des espaces. En dernier élément utile, déplacer les fichiers renommés dans un autre répertoire via une boucle peut nécessiter d’adapter la commande selon l’emplacement et le shell utilisé.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    $ ls
    ABCDEF_blablablablablablabla.extension    XXXXXX_blablablablablablabla.extension
    $ 
    $ rename 's/^(......).*\.(.*)/$1.$2/' *
    $ ls
    ABCDEF.extension  XXXXXX.extension
    $ 
    
    2
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      Ca ne marche pas aussi ?
      rename 's/^(......).*\./$1./' *
      0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      effectivement
      0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    $ ls -1 *.extension 
    ABCDEF_blablablablabla.extension 
    XYZXYZ_blabla blablablablabla.extension 
    
    p049784@FR20083393 ~ $ for f in *.extension;do mv -v "$f" "${f:0:6}.${f/*./}";done 
    'ABCDEF_blablablablabla.extension' -> 'ABCDEF.extension' 
    'XYZXYZ_blabla blablablablabla.extension' -> 'XYZXYZ.extension'
    $ ls -1 *.extension
    ABCDEF.extension
    XYZXYZ.extension
    


    GNU/Linux:Linux is Not Ubuntu! Quel linux choisir ne veut pas dire votre Distribution préférée,
    106485010510997108
    1
  3. Utilisateur anonyme
     
    en bash :
    var="ABCDEF_blablablablablablabla.extension"    
    echo "${var::6}.${var##*.}" 
    #ou 
    echo "${var%%_*}.${var##*.}"
    Il me semble que c'est POSIX, donc, ça devrait fonctionner avec tous les shells POSIX.
    1
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Salut,

      donc, oui ils ont tous un underscore après les 6 première caractères, mais ils peuvent en avoir d'autres derrières ...
      Donc "%%" plutôt ;-))

      echo "${var%%_*}.${var##*.}"
      0
    2. Utilisateur anonyme
       
      salut jipicy

      tout à fait, j'étais en train de corriger. :)
      0
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Les noms de fichiers sont tous du type 6 lettres suivies d'1 underscore suivi d'un nombres quelconque de caractères suivis d'1 point et d'1 extension ?

    En fait ont-ils tous un underscore ?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. diego92 Messages postés 14 Statut Membre
     
    Bonjour, déjà, merci pour l'intérêt que tu portes à mon problème.

    Pour te répondre plus précisément :

    ABCD9F (6 caractère alpha numérique)
    _ (tjs après les 6 première caractères)
    blabla : n'importe quel caractère même un underscore !
    .extension : tjs la même extension

    donc, oui ils ont tous un underscore après les 6 première caractères, mais ils peuvent en avoir d'autres derrières ...

    Merci d'avance
    0
  7. diego92 Messages postés 14 Statut Membre
     
    Merci à tous pour vos réponses ... par contre cela ne marche pas.

    J'ai oublié de vous précisez que j'étais en KSH (AIX)

    Et j'ai un message d'erreur suivant :

    0403-011 Substitution incorrecte pour cette commande

    Du coup, retour à la case départ lol
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Quelle solution qui ne marche et qui te renvoie l'erreur ?
      0
  8. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    et avec
    for F in ??????_*.* ; do mv $F $(echo $F|sed 's/^\(......\).*\./\1./') ; done 
    0
  9. diego92 Messages postés 14 Statut Membre
     
    Celles là :

    for f in *.extension;do
    mv -v "$f" "${f:0:6}.${f/*./}";done

    ou

    for file in $( ls ./); do
    if [[ -f $file && $file = *.* ]]; then
    mv $file "${file:0:8}.${file#*.}"
    fi
    done
    0
  10. Utilisateur anonyme
     
    "ça marche pas" n'est pas très informatif
    "mes" expressions POSIX devraient fonctionner, si Ksh/AIX est POSIX (c'est pas dit)

    for i in $(command)
    est à proscrire ! (imagine qu'il y ait des espaces)

    et ce sera plutôt, [[ -f $file ]] && [[ n'importe == quoi ]]
    0
  11. diego92 Messages postés 14 Statut Membre
     
    @qqchquicommenceparQ

    "for i in $(command) est à proscrire !"

    Pourquoi ?

    Merci d'avance

    @dubcek : Ta commande me fait disparaitre mes fichiers ?? impossible de remettre la main dessus lol
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Re,

      Pourquoi ?
      La réponse est entre les paranthèses.(imagine qu'il y ait des espaces)
      Si tu ne crois pas, tu peux créer des fichiers avec un espace dans le nom et tu verras.

      Quelque soit la solution que tu adopteras il faudra que tu nous montres commen nous l'avons fait (affiche la commande + le résultat) pour comprendre d'où viens ton erreur.
      On ne pourra pas t'aider si tous ne nous aide pas.
      0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      $ ls
      ABCDEF_blablablablablablabla.extension    XXXXXX_blablablablablablabla.extension
      $ 
      $ for F in ??????_*.* ; do mv $F $(echo $F|sed 's/^\(......\).*\./\1./') ; done 
      $ ls
      ABCDEF.extension  XXXXXX.extension
      $ 
      
      0
  12. Utilisateur anonyme
     
    désolé dubcek

    Ha, non!

    rename passe encore, même avec des points au lieu d'une expression, mais un sed à la place de bash, ou n'importe quelle substitution de paramètres POSIX, là, je dis non!
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      J'ai oublié de vous précisez que j'étais en KSH (AIX)
      0
  13. diego92 Messages postés 14 Statut Membre
     
    La solution de dubcek marche !

    Sinon, voilà ce que j'ai avec l'autre solution (mv)

    >for f in *.csv;do mv -v "$f" "${f:0:6}.${f/*./}";done
    ksh: "${f:0:6}.${f/*./}": 0403-011 Substitution incorrecte pour cette commande.
    >
    0
  14. Utilisateur anonyme
     
    hmm, ksh est POSIX, et donc peut parfaitement effectuer les substitutions de paramètre que j'ai évoqué.
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      sur AIX, c'est même pas sûr ... en remplaçant $() par '' ça fonctionne avec le plus archaique des sh
      0
    2. Utilisateur anonyme
       
      AI(e!)X
      0
    3. diego92 Messages postés 14 Statut Membre
       
      @dubcek :

      Ta substitution marche très bien ..; par contre je ne la comprend pas (lol, I am a débutant)
      Par exemple, j'aimerais enlever l'extension, et ne garder que les 6premières lettres des fichiers ?

      @qqchquicommenceparQ : Apparemment le fait que je sois en AIX bloque un peu. Ce n'est pas la première fois que je suis obligé de trouver d'autres méthodes pour de simples scripts ...
      0
    4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      $ ls
      ABCDEF_blablablablablablabla.extension    XXXXXX_blablablablablablabla.extension
      $ 
      $ for F in ??????_*.* ; do mv $F $(echo $F|sed 's/^\(......\).*/\1/') ; done 
      $ 
      $ ls
      ABCDEF    XXXXXX
      $
      0
  15. Utilisateur anonyme
     
    ok, tant qu'à utiliser sed, autant l'utiliser correctement
    echo "$F" | sed 's/\([^_]*\).*\(\..*\)/\1\2/
    oui,oui, c'est illisible : c'est sed !
    0
  16. diego92 Messages postés 14 Statut Membre
     
    Lol, c'est clairement illisible, je n'y comprends rien !

    Quelqu'un pourrait m'expliquer, c'est du chinois ? lol

    En tout cas ça marche ! Merci à vous pour votre aide !
    0
  17. Utilisateur anonyme
     
    lol

    sur GNU/Linux : man regex
    sur AIX : ?
    0
  18. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    sed 's/^\(......\).*/\1/'
    on sauve les 6 premiers caractères dans un champ que l'on restitue à droite avec \1, donc on supprime le reste de la ligne identifié avec .*
    0
  19. diego92 Messages postés 14 Statut Membre
     
    Cette solution finale marche parfaitement sous AIX (finalement j'ai viré l'extension)

    cd $pathtemp;
    for test in *.toto ; 
    	do mv $test $(echo "$test" | sed 's/\([^_]*\).*/\1/');
    done


    J'aimerais déplacer les fichiers transformés, dans un autre répertoire. Y a t'il moyen de rajouter une instruction de déplacement ds la boucle for ?

    Merci d'avance
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      do mv $test  /new_rep/$(echo "$test" | sed 's/\([^_]*\).*/\1/');
      0
    2. diego92 Messages postés 14 Statut Membre
       
      Merci, c'est good !

      Franchement un grand merci à vous tous, je me sens un peu moins bête ce soir ;-)

      @++
      0
    3. diego92 Messages postés 14 Statut Membre
       
      Re-bonjour,

      mon script doit évoluer et mes connaissance de la commande SED sont trop limitées :-(

      Je cherche maintenant à modifier mes noms de fichiers de la manière suivante ...

      ABCDEF55_blablablablablablabla.extension en
      en
      ABCDEF46_blablablablablablabla.extension en

      Autrement dit j'ai juste un changement des caractère [7-8] à faire et tjs 55->46

      Merci d'avance
      0
    4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      sed 's/55/46/'
      0
    5. diego92 Messages postés 14 Statut Membre
       
      Merci !

      Par contre je n'avais pas préciser un truc. Je peux rencontrer plusieurs fois le nombre 55 (ds la partie blablabla de mon fichier) mais je ne dois changer que ceux en 7ème et 8ème position !
      0