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

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

我想使用 Bash 脚本重命名同一目录中的多个文件。文件名称如下:

file2602201409853.p
file0901201437404.p  
file0901201438761.p  
file1003201410069.p  
file2602201410180.p

我想重命名为以下格式:

file2503201409853.p
file2503201437404.p  
file2503201438761.p  
file2503201410069.p  
file2503201410180.p

我正在阅读有关重命名命令的信息,并尝试这样做,但它什么也没做,我想我对语法有疑问。然后我读到你可以使用MV命令如下:

for file in cmpsms*2014*.p; do
    mv "$file" "${file/cmpsms*2014*.p/cmpsms25032014*.p}"
done

但我无法重命名这些文件。我究竟做错了什么?

答案1

您首先考虑重命名是正确的。如果您不习惯正则表达式,语法会有点奇怪,但一旦您知道自己在做什么,它就是迄今为止最快/最短的路线:

rename 's/\d{4}/2503/' file*

这只是匹配前 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

答案2

这应该可以解决问题:

for f in file*; do mv $f ${f/${f:4:8}/25032014}; done

它将第 4 个和第 12 个字符之间的字符串替换为“25032014”。

答案3

这确实是@Eric 上面的答案 - 但这是一个优雅的答案,所以我将其重新发布为正确的答案,以引起更多关注。

for f in *Huge*; do mv "$f" "${f/Huge/Monstrous}"; done

答案4

一种简单的本机方法,无需循环即可完成此操作,目录遍历:

find -type f | xargs -I {} mv {} {}.txt

它将重命名每个文件。

下面是一个工作示例并行化:

find -name "file*.p" | parallel 'f="{}" ; mv -- {} ${f:0:4}2503${f:8}'

相关内容