在UNIX系统中批量重命名文件

3

我有一组文件,如下:

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

还有其他不同扩展名的文件。我需要将"oldname"重命名为"newname",因此我尝试了以下方法:

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

但是那并不起作用... 有什么建议吗?

请在此处查看:http://theunixshell.blogspot.com/2013/01/bulk-renaming-of-files-in-unix.html - Vijay
2个回答

4

重命名文件的方法之一:

for i in oldname*; do mv "$i" "${i/oldname/newname}"; done

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

是的,我的代码行什么也没做。我刚试了一下重命名-v 's/^oldname/newname/' oldname*.*,但不幸的是它也没有起作用...我已经将权限更改为chmod 777,但也没有变化。 - madkitty
@madkitty,还需要更多的阅读和实验。你可以重新阅读一下答案吗? - paxdiablo
非常感谢您的回答,我会将这个保存在文件中,以便下一批需要重命名的文件使用。您的解释非常有用 :) - madkitty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接