我有一组文件如下:
- oldname_1.txt
- oldname_1.pdf
- oldname_1.bak
等等..每个都有不同的扩展名,我需要用“newname”重命名“oldname”所以我试过:
rename -v 's/\oldname_*.*$/\newname_*.*/’ oldname_*.*
但这不起作用..
有什么建议吗?
重命名文件的一种方法:
for i in oldname*; do mv "$i" "${i/oldname/newname}"; done
首先,您应该真正指定“不起作用”的实际含义。它什么都不做吗?它会错误地重命名它们吗?它是否会向您身体的某些私密部位传递电脉冲?:-)
无论如何,我会从:
rename -v 's/^oldname/newname/' oldname_*.*
没有必要在实际表达式中包含通配符,特别是因为它的含义与您的想法不同 (xyz_*
表示xyz
后面跟着零个或多个_
字符,并不意味着后面xyz_
跟着任何东西,.*
只是自找麻烦,因为这意味着零或更多任何字符)。
文件名的过滤由最后一个参数完成。由于您知道只有与该参数匹配的文件才会被重命名,因此您可以定制正则表达式来更改第一位。
此外,请确保您拥有正确的rename
. Linux有不同的rename
可用语法,它们具有不同的语法:
rename oldname newname oldname_*.*
在这些系统中,正则表达式变体通常称为prename
.
最后,请原谅可能是一个愚蠢的问题,您确定文件的名称是您期望的名称吗?一个简单的ls -al oldname*
应该显示这一点。
顺便说一句,这在我的 Debian 盒子下运行良好:
pax> touch oldname_1.txt oldname_1.pdf oldname_1.bak
pax> ll *name*
-rw-r--r-- 1 pax pax 0 Sep 6 10:56 oldname_1.bak
-rw-r--r-- 1 pax pax 0 Sep 6 10:56 oldname_1.pdf
-rw-r--r-- 1 pax pax 0 Sep 6 10:56 oldname_1.txt
pax> rename -v 's/^oldname/newname/' oldname_*.*
oldname_1.bak renamed as newname_1.bak
oldname_1.pdf renamed as newname_1.pdf
oldname_1.txt renamed as newname_1.txt
pax> ll *name*
-rw-r--r-- 1 pax pax 0 Sep 6 10:56 newname_1.bak
-rw-r--r-- 1 pax pax 0 Sep 6 10:56 newname_1.pdf
-rw-r--r-- 1 pax pax 0 Sep 6 10:56 newname_1.txt