Renommer plusieurs fichiers sous Linux / Unix

J’ai plus d’un millier de fichiers de noms similaires dans un répertoire et je souhaite les renommer. Les fichiers sont de ce format

GW_LGMS01-50160306185154-01375272.CDR GW_LGMS01-50160306237154-01375272.CDR.00001 GW_LGMS02-50160306133554-02308872.CDR GW_LGMS02-50160306137554-02308872.CDR.00014 GW_LGMS03-50160306221836-02217475.CDR.00001 GW_LGMS03-50160306235132-02217475.CDR 

Je veux les renommer tous en même temps pour append un 0- avant 50160306 sur chacun d’eux. C’est,

 GW_LGMS01-0-50160306185154-01375272.CDR GW_LGMS01-0-50160306237154-01375272.CDR.00001 GW_LGMS02-0-50160306133554-02308872.CDR GW_LGMS02-0-50160306137554-02308872.CDR.00014 GW_LGMS03-0-50160306221836-02217475.CDR.00001 GW_LGMS03-0-50160306235132-02217475.CDR 

50160306 est ce que tous les fichiers ont en commun.

En supposant que -50160306 est unique dans les noms de fichiers et que vous utilisez un shell qui comprend ${parameter/pattern/ssortingng} (Bash, KornShell, etc.):

 for f in *.CDR*; do echo mv "$f" "${f/-50160306/-0-50160306}" done 

Faites-le avec l’ echo en place pour voir ce qui se produirait, puis supprimez l’ echo lorsque vous êtes certain de bien faire les choses.

Si vous avez peur de faire des bêtises, placez simplement les fichiers avec les nouveaux noms dans un nouveau dossier:

 mkdir renamed for f in *.CDR*; do cp "$f" renamed/"${f/-50160306/-0-50160306}" done 

Si vous n’utilisez pas bash:

 #!/bin/sh for i in * ; do mv "$i" "$(printf '%s' "$i" | sed 's/\(50160306.*\)/0-\1/')" done 

Il existe deux outils de rename : l’un fait partie du paquetage util-linux, l’autre est basé sur Perl (voir cette réponse pour plus de détails). Pour savoir lequel vous avez, vérifiez à la fin de la page de manuel ( man rename ).

Avec la version util-linux, vous pouvez renommer vos fichiers comme suit:

 rename 50160306 0-50160306 * 

et pour la version basée sur Perl, ce serait (non testé!)

 rename 's/50160306/0-$&/' * 

Sachez qu’il n’y a pas de protection avec ces commandes – testez-les sur un petit échantillon avant de les utiliser.