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?
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.