3

我有一组文件如下:

  • oldname_1.txt
  • oldname_1.pdf
  • oldname_1.bak

等等..每个都有不同的扩展名,我需要用“newname”重命名“oldname”所以我试过:

rename -v 's/\oldname_*.*$/\newname_*.*/’ oldname_*.*

但这不起作用..

有什么建议吗?

4

2 回答 2

4

重命名文件的一种方法:

for i in oldname*; do mv "$i" "${i/oldname/newname}"; done
于 2012-09-06T03:01:48.763 回答
3

首先,您应该真正指定“不起作用”的实际含义。它什么都不做吗?它会错误地重命名它们吗?它是否会向您身体的某些私密部位传递电脉冲?:-)

无论如何,我会从:

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
于 2012-09-06T02:40:49.123 回答