在 bash 中使用正则表达式和 mv
Use of regex in bash with mv
我有 4 个文件要重命名:
./01:
I0010001 I0020001
./02:
I0010001 I0020001
我想为每个文件添加辅助文件名.dcm
,所以我试过:
$ mv \(*/*\) .dcm
mv: cannot stat '(*/*)': No such file or directory
$ mv \(./*/*\) .dcm
mv: cannot stat '(./*/*)': No such file or directory
$ mv \(./\*/\*\) .dcm
mv: cannot stat '(./*/*)': No such file or directory
$ mv "\(./*/*\)" ".dcm"
mv: cannot stat '\(./*/*\)': No such file or directory
$ mv 0\([1-2]\)/I00\([1-2\)]0001 0/I00001.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/I00001.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/I00001.dcm"
mv: cannot stat '0\([1-2]\)/I00\([1-2]\)0001': No such file or directory
$ mv "0\([[:digit:]]\)/I00\([[:digit:]]\)0001" "0/I00001.dcm"
mv: cannot stat '0\([[:digit:]]\)/I00\([[:digit:]]\)0001': No such file or directory
$ mv "0\([1-2]\)\/I00\([1-2]\)0001" "0/I00001.dcm"
mv: cannot stat '0\([1-2]\)\/I00\([1-2]\)0001': No such file or directory
$ mv \(*\) .dcm
mv: cannot stat '(*)': No such file or directory
None 个结果是我想要的。
这里你真的不需要正则表达式,用一个 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
是调试模式(打印会发生什么但不要 实际上 重命名)。一旦您满意就将其移除,它会按照您的意愿行事。
我有 4 个文件要重命名:
./01:
I0010001 I0020001
./02:
I0010001 I0020001
我想为每个文件添加辅助文件名.dcm
,所以我试过:
$ mv \(*/*\) .dcm
mv: cannot stat '(*/*)': No such file or directory
$ mv \(./*/*\) .dcm
mv: cannot stat '(./*/*)': No such file or directory
$ mv \(./\*/\*\) .dcm
mv: cannot stat '(./*/*)': No such file or directory
$ mv "\(./*/*\)" ".dcm"
mv: cannot stat '\(./*/*\)': No such file or directory
$ mv 0\([1-2]\)/I00\([1-2\)]0001 0/I00001.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/I00001.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/I00001.dcm"
mv: cannot stat '0\([1-2]\)/I00\([1-2]\)0001': No such file or directory
$ mv "0\([[:digit:]]\)/I00\([[:digit:]]\)0001" "0/I00001.dcm"
mv: cannot stat '0\([[:digit:]]\)/I00\([[:digit:]]\)0001': No such file or directory
$ mv "0\([1-2]\)\/I00\([1-2]\)0001" "0/I00001.dcm"
mv: cannot stat '0\([1-2]\)\/I00\([1-2]\)0001': No such file or directory
$ mv \(*\) .dcm
mv: cannot stat '(*)': No such file or directory
None 个结果是我想要的。
这里你真的不需要正则表达式,用一个 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
是调试模式(打印会发生什么但不要 实际上 重命名)。一旦您满意就将其移除,它会按照您的意愿行事。