【问题标题】:How to do a mass rename?如何进行批量重命名?
【发布时间】:2010-09-29 21:29:39
【问题描述】:

我需要像这样重命名文件名

transform.php?dappName=Test&transformer=YAML&v_id=XXXXX

就这个

XXXXX.txt

我该怎么做?

我知道我需要多个 mv 命令,因为它们至少有 25000 个文件。

【问题讨论】:

标签: unix shell rename


【解决方案1】:

vimv 允许您使用 Vim 的文本编辑功能重命名多个文件。

输入vimv 会打开一个列出所有文件的 Vim 窗口,您可以进行模式匹配、视觉选择等来编辑名称。退出 Vim 后,文件将被重命名。

[免责声明:我是该工具的作者]

【讨论】:

【解决方案2】:

这个renamer 命令可以做到:

$ renamer --regex --find 'transform.php?dappName=Test&transformer=YAML&v_id=(\w+)' --replace '$1.txt' *

【讨论】:

    【解决方案3】:

    最简单的解决方案是使用 "mmv"

    你可以写:

    mmv "long_name*.txt" "short_#1.txt"
    

    其中“#1”被第一个通配符匹配的任何内容替换。 类似地,#2 被第二个替换,等等。

    所以你做类似的事情

    mmv "index*_type*.txt" "t#2_i#1.txt"
    

    将 index1_type9.txt 重命名为 t9_i1.txt

    mmv 在许多 Linux 发行版中不是标准的,但在网上很容易找到。

    【讨论】:

    • mmv 命令缺少第二个通配符。应该是 mmv "indextype.txt" "t#2_i#1.txt"
    • 如果这是你第一次使用 mmv,最好先试试 mmv -n ,它会告诉你在不重写任何东西的情况下它会做什么。
    • 这是一个不错的小工具。我喜欢它具有用于复制、链接甚至附加文件的别名形式。
    • 在带有 Cygwin 的 Windows 中效果很好
    • 请注意,使用多个哈希需要使用引号或mmv 引发错误。
    【解决方案4】:

    这也应该有效:

    prfx='transform.php?dappName=Test&transformer=YAML&v_id='

    ls $prfx* | sed s/$prfx// | xargs -Ipsx mv "$prfx"psx psx

    【讨论】:

      【解决方案5】:

      我会使用ren-regexp,这是一个 Perl 脚本,可以让您轻松地批量重命名文件。

      21:25:11 $ ls
      transform.php?dappName=Test&transformer=YAML&v_id=12345
      
      21:25:12 $ ren-regexp 's/transform.php.*v_id=(\d+)/$1.txt/' transform.php*
      
        transform.php?dappName=Test&transformer=YAML&v_id=12345
      1 12345.txt
      
      
      21:26:33 $ ls
      12345.txt
      

      【讨论】:

        【解决方案6】:

        好的,您需要能够为此运行 Windows 二进制文件。

        但如果你可以运行Total Commander,请执行以下操作:

        1. 选择所有带 * 的文件,然后按 ctrl-M

        2. 搜索字段中,粘贴“transform.php?dappName=Test&transformer=YAML&v_id="

          (将替换留空)

        3. 开始

        没有比这更简单的了。 您还可以通过此对话框使用正则表达式重命名,并实时预览文件将如何重命名。

        【讨论】:

        • 我一直在从我的 Windows 桌面访问 unix 系统...只是建议我将如何解决这个问题。
        • 哇,这么多年过去了,我仍然对这个投了反对票。 :)
        【解决方案7】:

        您编写了一个相当简单的 shell 脚本,其中最棘手的部分是修改名称。

        脚本的大纲很简单(这里是bash语法):

        for i in 'transform.php?dappName=Test&transformer=YAML&v_id='*
        do
            mv $i <modified name>
        done
        

        修改名称有很多选择。我认为最简单的可能是 awk one-liner like

        `echo $i  |  awk -F'=' '{print $4}'`
        

        所以...

        for i in 'transform.php?dappName=Test&transformer=YAML&v_id='*
        do
            mv $i `echo $i |  awk -F'=' '{print $4}'`.txt 
        done
        

        更新

        好的,如下所述,这不一定适用于足够大的文件列表; * 将超出命令行长度限制。所以,然后你使用:

        $ find . -name 'transform.php?dappName=Test&transformer=YAML&v_id=*' -prune -print |
        while read
        do
            mv $reply `echo $reply |  awk -F'=' '{print $4}'`.txt 
        done
        

        【讨论】:

        • 在大多数 Linux 发行版中都有一个名为“重命名”的命令。请参阅 briens 的回答。
        • 也许是这样,但不是所有的 UNIX 系统(例如我的 Mac 上没有)并且这是可以应用于其他问题的一般模式。
        • 至少在 Bash 和 Dash 中,在 glob(或任何内置函数)上的 for 循环不受“命令行太长”限制,因此您的第一种方法也可以对于很长的文件列表;见this answer
        【解决方案8】:
        find -name '*v_id=*' | perl -lne'rename($_, qq($1.txt)) if /v_id=(\S+)/'
        

        【讨论】:

        • 我们实际上可以制作一个专门介绍各种方法的网页。
        【解决方案9】:

        您可以使用任何您想转换的名称(perl、sed、awk 等)。我将使用 python 单线:

        for file in 'transform.php?dappName=Test&transformer=YAML&v_id='*; do 
            mv $file `echo $file | python -c "print raw_input().split('=')[-1]"`.txt;
        done
        

        这是完全用 Python 编写的相同脚本:

        import glob, os
        PATTERN="transform.php?dappName=Test&transformer=YAML&v_id=*"
        
        for filename in glob.iglob(PATTERN):
              newname = filename.split('=')[-1] + ".txt"
              print filename, '==>', newname
              os.rename(filename, newname)
        

        旁注:您可以更轻松地保存具有正确名称的页面,同时抓取它们...

        【讨论】:

        • 哈哈哈,我的awk程序比较短。 ;-)
        • Right :) awk 非常适合这类工作。不幸的是,您的 sh 脚本和我的 sh 脚本都不适用于 100000 个文件(命令行长度有限制,* 可能会打破这种限制)。如果是这种情况,重命名或专用脚本是更好的解决方案。
        • @Federico:我要补充一点,Python 脚本 (glob.iglob()) 有更好的机会处理 100000 个文件。
        【解决方案10】:

        如果您使用的是 zsh,您也可以这样做:

        autoload zmv
        zmv 'transform.php?dappName=Test&transformer=YAML&v_id=(*)' '$1.txt'
        

        【讨论】:

        • 他做到了?你是说标签吗?不是他加的
        • 即使他使用的是 bash,他也总是可以运行 zsh 然后使用这个答案。
        【解决方案11】:

        试试rename command

        或者您可以将 ls 的结果通过管道传输到 perl 正则表达式中。

        【讨论】:

        • 你是如何使用rename 命令做到这一点的?
        • 像这样:重命名 transform.php\?dappName\=Test\&transformer\=YAML\&v_id\= '' transform.php*
        • @8jean:据我了解,问题的结果应该是:s/.*?v_id=(.*)/$1.txt/。我在你的评论中没有看到。
        • 啊,我错过了“.txt”扩展名。似乎没有简单的方法可以使用“重命名”来添加它。
        猜你喜欢
        • 2012-11-15
        • 1970-01-01
        • 2020-02-20
        • 2010-10-17
        • 1970-01-01
        • 2017-03-06
        • 1970-01-01
        • 2011-04-17
        • 2014-09-10
        相关资源
        最近更新 更多