使用 Bash 脚本重命名多个文件

fra*_*a66 28 bash rename

我想使用 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)

  • 请注意,这是 Debian 及其衍生产品(Ubuntu、Mint 等)上的 Perl 重命名。在其他 Linux 发行版上,`rename` 是一个完全不同的文件重命名工具(Debian 作为 `rename.ul` 提供)。 (9认同)

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)