Renommer la sous-chaîne dans les noms de fichiers unix

J’ai un chargement de fichiers du format:

output_t00010000-0470090205_p000000.xdr output_t00010000-0470090205_p000001.xdr 

etc.

Ce que je veux vraiment, c’est trouver tous les fichiers qui correspondent à t00010000 , et pour chaque fichier correspondant, renommez t00010000-0470090205 en t00000000-0000000000.

Donc j’ai fait quelque chose comme ça:

 find . -depth -name *t00010000* | xargs rename t00010000-0470090205 t00000000-0000000000 

Cela fonctionne très bien lorsque je connais la seconde moitié de la sous-chaîne, par exemple 0470090205, mais cette sous-chaîne est générée aléatoirement en fonction de la simulation que je lance et je ne la connais pas à l’avance. Donc, ce que je veux vraiment, c’est quelque chose comme:

 find . -depth -name *t00010000* | xargs rename t00010000-?????????? t00000000-0000000000 

mais renommer ne me laisse pas utiliser le? symbole de correspondance de caractère. J’ai vraiment du mal à comprendre cela. Quelqu’un peut-il aider?

Les arguments à rename sont les suivants:

 rename [ -v ] [ -n ] [ -f ] perlexpr [ files ] 

Le perlexpr devrait être une expression Perl qui transforme le nom d’origine en un nouveau nom. Dans votre cas, ce serait:

 rename 's/t\d+-\d+/t00000000-0000000000/' 

Alors:

 find . -depth -name *t00010000* | xargs rename 's/t\d+-\d+/t00000000-0000000000/' 

Un bon moyen de tester le rename est d’utiliser l’option -n , qui vous indiquera comment chaque fichier sera renommé sans le faire.