web-dev-qa-db-fra.com

Comment changer l'expression dans le nom du fichier?

J'ai des dossiers avec plusieurs fichiers en eux. Il y a une expression dans les noms que j'aimerais changer.

Par exemple:

find /path/ -type f -name '*0050ABC_01032013*'

me donne une sortie comme celle-ci:

/path/0050ABC_01032013/t1mri/T1pre_2013-3-1/default_analysis/segmentation/mesh/0050ABC_01032013_Rhemi.gii.minf
/path/0050ABC_01032013/t1mri/T1pre_2013-3-1/default_analysis/segmentation/Lcortex_0050ABC_01032013.nii
/path/0050ABC_01032013/t1mri/T1pre_2013-3-1/default_analysis/segmentation/Lgrey_white_0050ABC_01032013.nii.minf
/path/0050ABC_01032013/ct/CTpost_2013-3-1/registration/CT-0050ABC_01032013_CTpost_2013-3-1_TO_Scanner_Based.trm

Je veux changer 0050ABC_01032013 à 0044CBA_01011901.

J'ai essayé ceci:

find /path/ -type f -name '*0050ABC_01032013*' -execdir rename s/\.\/(w+)0050ABC_01032013(w+)$/$10044CBA_01011901$2/' {} \;

Mais ça ne marche pas. Que devrais-je faire?

5
p.deman

rename n'est pas si compliqué :) Spécifiez simplement la partie que vous souhaitez modifier et le reste sera laissé seul. Utilisez g pour modifier toutes les occurrences du chemin (y compris les noms de répertoire).

find /path/ -type f -name '*0050ABC_01032013*' -exec rename -n 's/0050ABC_01032013/0044CBA_01011901/g' '{}' \;

Supprimer -n après les tests pour renommer réellement les fichiers

find /path/ -type f -name '*0050ABC_01032013*' -exec rename 's/0050ABC_01032013/0044CBA_01011901/g' '{}' \;

Si vous avez un répertoire quelque part dans le chemin portant le même nom et que vous ne le faites pas voulez changer le nom du répertoire, vous pouvez vous assurer que seul le nom de base est modifié comme ceci

find /path/ -type f -name '*0050ABC_01032013*' -exec rename -n 's/0050ABC_01032013([^\/]*)$/0044CBA_01011901$1/' '{}' \;

Cela évite de faire correspondre la chaîne s'il y a un caractère / après.

6
Zanna