【问题标题】:Rename batch of file in UNIX在 UNIX 中重命名批处理文件
【发布时间】:2012-08-30 19:26:31
【问题描述】:

我有一组文件如下:

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

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

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

但这不起作用..

有什么建议吗?

【问题讨论】:

标签: unix rename


【解决方案1】:

重命名文件的一种方法:

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

【讨论】:

    【解决方案2】:

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

    无论如何,我会从:

    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
    

    【讨论】:

    • 是的,我的线路什么也没做。我也试过 rename -v 's/^oldname/newname/' oldname*.* 不幸的是它也没有做任何事情..我已经将权限更改为 chmod 777,也没有任何更改。
    • @madkitty,更多的阅读和实验。你能重读一下答案吗?
    • 非常感谢您的回答,我将把它保存在文件中以便下一批文件重命名,您的解释非常有用:)
    猜你喜欢
    • 2014-09-24
    • 1970-01-01
    • 2019-06-08
    • 2012-12-10
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    相关资源
    最近更新 更多