2016-12-19 18 views
2

我有4个文件重命名:使用正则表达式在bash与MV

./01: 
I0010001 I0020001 

./02: 
I0010001 I0020001 

我想辅助文件名.dcm添加到每个文件,所以我曾尝试:

$ mv \(*/*\) \1.dcm 
mv: cannot stat '(*/*)': No such file or directory 

$ mv \(./*/*\) \1.dcm 
mv: cannot stat '(./*/*)': No such file or directory 

$ mv \(./\*/\*\) \1.dcm 
mv: cannot stat '(./*/*)': No such file or directory 

$ mv "\(./*/*\)" "\1.dcm" 
mv: cannot stat '\(./*/*\)': No such file or directory 

$ mv 0\([1-2]\)/I00\([1-2\)]0001 0\1/I00\20001.dcm 
mv: cannot stat '0([1-2])/I00([1-2)]0001': No such file or directory 

$ mv "0\([1-2]\)/I00\([1-2\)]0001" "0\1/I00\20001.dcm" 
mv: cannot stat '0\([1-2]\)/I00\([1-2\)]0001': No such file or directory 

$ mv "0\([1-2]\)/I00\([1-2]\)0001" "0\1/I00\20001.dcm" 
mv: cannot stat '0\([1-2]\)/I00\([1-2]\)0001': No such file or directory 

$ mv "0\([[:digit:]]\)/I00\([[:digit:]]\)0001" "0\1/I00\20001.dcm" 
mv: cannot stat '0\([[:digit:]]\)/I00\([[:digit:]]\)0001': No such file or directory 

$ mv "0\([1-2]\)\/I00\([1-2]\)0001" "0\1/I00\20001.dcm" 
mv: cannot stat '0\([1-2]\)\/I00\([1-2]\)0001': No such file or directory 

$ mv \(*\) \1.dcm 
mv: cannot stat '(*)': No such file or directory 

他们没有产生我想要的结果。

+0

所以你知道:你的问题在于这些不是正则表达式:bash中的明星使用[globbing](https://linux.die.net/man/7/glob)。这里特别的区别是没有捕获组:圆括号只是被视为文字。 – Chris

回答

3

你并不真的需要这里的正则表达式,这是很简单的一个for循环:

for f in 0[12]/I00[12]0001 ; do mv "$f" "${f}.dcm" ; done 

对于更复杂的情况,你应该寻找到rename程序(prename在某些系统上)它使用强大的Perl正则表达式来处理重命名。虽然不必要在这里,这个简单的情况下,可以使用:

pax> rename -n 's/$/.dcm/' 0[12]/I00[12]0001 
rename(I01/I0010001, I01/I0010001.dcm) 
rename(I01/I0020001, I01/I0020001.dcm) 
rename(I02/I0010001, I02/I0010001.dcm) 
rename(I02/I0020001, I02/I0020001.dcm) 

-n是调试模式(打印会发生什么,但不要实际上重命名)。一旦你开心就把它删除,它会做你想做的。