Как изменить выражение в имени файла?

У меня есть папки с несколькими файлами в них. В именах есть выражение, которое я хотел бы изменить.

Например:

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

дает мне вывод, как это:

/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

Я хочу изменить 0050ABC_01032013 на 0044CBA_01011901.

Я попробовал это:

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

Но это не работает. Что я должен делать?

1 ответ

Решение

rename это не так сложно:) Просто укажите часть, которую вы хотите изменить, а остальные останутся в покое. использование g изменить все вхождения в пути (включая имена каталогов)

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

Удалить -n после тестирования, чтобы действительно переименовать файлы

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

Если у вас есть каталог где-то в пути с тем же именем, и вы не хотите изменять имя каталога, вы можете убедиться, что только базовое имя будет изменено следующим образом

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

Это позволяет избежать совпадения строки, если есть / персонаж в любом месте после него.

Другие вопросы по тегам