【发布时间】:2012-08-30 19:26:31
【问题描述】:
我有一组文件如下:
- oldname_1.txt
- oldname_1.pdf
- oldname_1.bak
等等..每个都有不同的扩展名,我需要用“newname”重命名“oldname”所以我尝试了:
rename -v 's/\oldname_*.*$/\newname_*.*/’ oldname_*.*
但这不起作用..
有什么建议吗?
【问题讨论】:
我有一组文件如下:
等等..每个都有不同的扩展名,我需要用“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
【讨论】: