使用 mv 在 bash 中使用正则表达式

Eri*_*tol 5 regex bash mv file-rename batch-rename

我有 4 个文件要重命名:

./01:
I0010001  I0020001

./02:
I0010001  I0020001
Run Code Online (Sandbox Code Playgroud)

我想为.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
Run Code Online (Sandbox Code Playgroud)

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

pax*_*blo 5

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

for f in 0[12]/I00[12]0001 ; do mv "$f" "${f}.dcm" ; done
Run Code Online (Sandbox Code Playgroud)

对于更复杂的情况,您应该查看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)
Run Code Online (Sandbox Code Playgroud)

-n是调试模式(打印会发生什么但实际上不重命名)。一旦您感到满意,就将其删除,它会做您想做的事。

  • 这并不能真正回答问题。也许将故障排除作为观察并主要解释如何使用带有 `mv` 的正则表达式会更好 (3认同)
  • @Sylvain,如果你问一个木匠如何用锤子砍一些木头,只有最虐待狂或最疯狂的人会建议除了放下锤子并使用锯子之外的任何其他东西:-) 这里的*问题*不是如何使用 `mv`(尽管它看起来像),它是如何以某种方式重命名文件。我建议 OP 也采用这种思维方式,因为他们接受了答案。 (2认同)