我想使用 Bash 脚本重命名同一目录中的多个文件。文件名如下:
file2602201409853.p
file0901201437404.p
file0901201438761.p
file1003201410069.p
file2602201410180.p
Run Code Online (Sandbox Code Playgroud)
我想重命名为以下格式:
file2503201409853.p
file2503201437404.p
file2503201438761.p
file2503201410069.p
file2503201410180.p
Run Code Online (Sandbox Code Playgroud)
我正在阅读重命名命令,并尝试以这种方式执行此操作,但它什么也没做,我想我对语法有疑问。然后我读到您可以使用mv命令进行循环,如下所示:
for file in cmpsms*2014*.p; do
mv "$file" "${file/cmpsms*2014*.p/cmpsms25032014*.p}"
done
Run Code Online (Sandbox Code Playgroud)
但我无法重命名文件。我究竟做错了什么?
Oli*_*Oli 45
您首先考虑重命名是正确的。如果您不习惯使用正则表达式,则语法有点奇怪,但是一旦您知道自己在做什么,它就是迄今为止最快/最短的路线:
rename 's/\d{4}/2503/' file*
Run Code Online (Sandbox Code Playgroud)
这只是匹配前 4 个数字并将它们交换为您指定的数字。
和使用您的文件名的测试工具(-vn
意味着冗长但不做任何事情):
$ rename 's/\d{4}/2503/' file* -vn
file0901201437404.p renamed as file2503201437404.p
file0901201438761.p renamed as file2503201438761.p
file1003201410069.p renamed as file2503201410069.p
file2602201409853.p renamed as file2503201409853.p
file2602201410180.p renamed as file2503201410180.p
Run Code Online (Sandbox Code Playgroud)
cha*_*aos 25
这应该可以解决问题:
for f in file*; do mv $f ${f/${f:4:8}/25032014}; done
Run Code Online (Sandbox Code Playgroud)
它将第 4 个和第 12 个字符之间的字符串替换为“25032014”。
Yeh*_*sef 11
这确实是@Eric 上面的回答 - 但这是一个优雅的回答,所以我将其重新发布为正确的答案,以引起更多人的注意。
for f in *Huge*; do mv "$f" "${f/Huge/Monstrous}"; done
Run Code Online (Sandbox Code Playgroud)