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