我有多个文件(大约1000个)这样命名:
abcdefg123456.xyz
abcdefg123457.xyz
abcdefg123458.xyz
abcdefg123459.xyz
一些文件在名称后面有4个附加的随机数字和字母(按任意顺序)。这些可能是重复的,但并非总是如此,因此我需要将它们更改为原始格式以验证它们是否重复。他们有这种格式:
abcdefg123456a789.xyz
abcdefg123457b987.xyz
abcdefg123458c879.xyz
abcdefg123459d897.xyz
有时,也有错误的扩展,
abcdefg123456.xyzedf
abcdefg123456.xyzfed
我想将这些文件重命名为abcdefg的原始格式,后跟原始的6个数字 - 即删除尾随的4个随机数和字母,并删除尾随的扩展名.xyz到目前为止,我所拥有的是:
rename -n "s/[a-z][0-9]{6}.xyz/.xyz/g" *
但它似乎没有用。由于某种原因,输出是:
abcdef.xyz (no numbers)
编辑:我在选择哪个答案之间有点不知所措,因为两者都有助于找到解决方案。因为他帮助解决了问题的第二部分,所以我选择了stuts。但是你的帮助也非常感谢Mark Perryman - 当然还有评论者。
我知道了。我正在捕捉我想要保留的部分,而不是我要删除的部分。如果无法重命名文件,我该如何删除?如果数字和字母的顺序是什么不完全
—
user681866
...a789.xyz
,...b987.xyz
但遵循随机模式代替:...a7b8.xyz
,...c9d7.xyz
。谢谢。
如果第一个附加字符是一个字母,那么
—
AFH
rename -n "s/[a-z][a-z0-9]{3}\.xyz.*/.xyz/g" *
就可以了。如果没有,你不能简单地[a-z0-9]{4}
在匹配模式中使用,因为这将删除标准格式文件中的最后四位数,并且您将需要使用匹配组,如在答案中,尽管您可以尝试rename -n "s/[a-z0-9]{4}\.xyz.*/.xyz/g" ?????????????????.xyz*
(17个查询),应该只处理较长的文件名。请注意正则表达式匹配和shell文件扩展之间的区别。
我更新的答案(使用单引号允许$工作)和-f选项以确保删除重复文件是一个更整洁的单行解决方案;-)
—
Mark Perryman
{6}
数字:对于您的示例,这应该是{3}
。要在.xyz
需要添加.*
到匹配字符串末尾之后删除多余字符,请rename -n "s/[a-z][0-9]{3}\.xyz.*/.xyz/g" *
作为命令给出(省略-n
对操作感到满意的时间)。