Comment renommer 350 fichiers d'un coup d'un seul sous Linux-bash
Je me suis retrouvé dans la situation ou dans un répertoire j'avais 350 fichiers du style dtmgrid122413_1m.asc.gz qu'il fallai que je renomme en MNT_1224-13_1m.asc.gz
grâce aux pipe et à sed c'est possible en une seule commande:
for i in dtm*; do (mv $i `echo $i|sed 's/dtmgrid\([1-9]\{4\}\)/MNT_\1-/'`); done
on retrouve une boucle for qui parcoure chaque fichier dans le répertoire courant et le stocke dans la variable i. Puis pour chaque fichier trouver on va faire un mv pour renommer l'ancien nom de fichier se trouvant en $i en quelquechose qui se trouve etre le résultat de l'expression:
`echo $i|sed 's/dtmgrid\([1-9]\{4\}\)/MNT_\1-/'`
notez bien que l'expression est entre backquotes c'est grâce à cela que l'on reçoit la valeur finale de l'éxécution de cette suite de commande et non pas une simple chaine de caractères équivalent à notre commande...
en gros c'est grâce à une substitution sed " s/avant/apres/ " qui reçoit l'ancien nom de fichier et le convertit selon nos désirs grâce à l'expression régulière qui dit que l'on veut remplacer:
dtmgrid\([1-9]\{4\}\)
par:
MNT_\1-
ce qui signifie que dtmgrid sera remplace sans autre par MNT_ et que le contenu de la chaine se trouvant entre parenthèse \( et \) sera à l'arrivée dans la chaine finale utilisé tel quel grâce au \1 et que l'on veut faire suivre cela par un - avant de laisser s'afficher le reste de la chaine en l'état
pour ce qui est du contenu ente parenthèse et bien le [1-9] indique que l'on cherche n'importe quel chiffre entre 1 et 9 et le \{4\} signifie que l'on veut prendre en compte très exactement 4 chiffres.
grâce aux pipe et à sed c'est possible en une seule commande:
for i in dtm*; do (mv $i `echo $i|sed 's/dtmgrid\([1-9]\{4\}\)/MNT_\1-/'`); done
on retrouve une boucle for qui parcoure chaque fichier dans le répertoire courant et le stocke dans la variable i. Puis pour chaque fichier trouver on va faire un mv pour renommer l'ancien nom de fichier se trouvant en $i en quelquechose qui se trouve etre le résultat de l'expression:
`echo $i|sed 's/dtmgrid\([1-9]\{4\}\)/MNT_\1-/'`
notez bien que l'expression est entre backquotes c'est grâce à cela que l'on reçoit la valeur finale de l'éxécution de cette suite de commande et non pas une simple chaine de caractères équivalent à notre commande...
en gros c'est grâce à une substitution sed " s/avant/apres/ " qui reçoit l'ancien nom de fichier et le convertit selon nos désirs grâce à l'expression régulière qui dit que l'on veut remplacer:
dtmgrid\([1-9]\{4\}\)
par:
MNT_\1-
ce qui signifie que dtmgrid sera remplace sans autre par MNT_ et que le contenu de la chaine se trouvant entre parenthèse \( et \) sera à l'arrivée dans la chaine finale utilisé tel quel grâce au \1 et que l'on veut faire suivre cela par un - avant de laisser s'afficher le reste de la chaine en l'état
pour ce qui est du contenu ente parenthèse et bien le [1-9] indique que l'on cherche n'importe quel chiffre entre 1 et 9 et le \{4\} signifie que l'on veut prendre en compte très exactement 4 chiffres.
Commentaires