p.d*_*man 5 command-line bash find rename batch-rename
我有包含多个文件的文件夹。我想更改名称中的表达式。
例如:
find /path/ -type f -name '*0050ABC_01032013*'
Run Code Online (Sandbox Code Playgroud)
给我一个这样的输出:
/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
Run Code Online (Sandbox Code Playgroud)
我想将 0050ABC_01032013 更改为 0044CBA_01011901。
我试过这个:
find /path/ -type f -name '*0050ABC_01032013*' -execdir rename s/\.\/(w+)0050ABC_01032013(w+)$/$10044CBA_01011901$2/' {} \;
Run Code Online (Sandbox Code Playgroud)
但它不起作用。我该怎么办?
rename不是那么棘手 :) 只需指定您要更改的部分,其余部分就不用管了。使用g修改所有出现在路径(包括目录名)
find /path/ -type f -name '*0050ABC_01032013*' -exec rename -n 's/0050ABC_01032013/0044CBA_01011901/g' '{}' \;
Run Code Online (Sandbox Code Playgroud)
-n测试后删除以真正重命名文件
find /path/ -type f -name '*0050ABC_01032013*' -exec rename 's/0050ABC_01032013/0044CBA_01011901/g' '{}' \;
Run Code Online (Sandbox Code Playgroud)
如果您在使用相同名称的路径的目录里,你不希望更改目录名,就可以确保只有基本名称被修改这样的
find /path/ -type f -name '*0050ABC_01032013*' -exec rename -n 's/0050ABC_01032013([^\/]*)$/0044CBA_01011901$1/' '{}' \;
Run Code Online (Sandbox Code Playgroud)
如果字符串/后面有任何字符,这将避免匹配字符串。