【问题标题】:bash Linux - Massive folder renamebash Linux - 大量文件夹重命名
【发布时间】:2011-01-04 07:19:08
【问题描述】:

在我们的 Linux 文件服务器 (RedHat Enterprise) 上,我们有一些需要重命名的文件夹,其中包含客户端工作。旧的文件夹格式(需要更改的)是clientcode_jobnumberjobname。新格式为clientcode_jobnumber_jobname。我们基本上需要通过在jobnumberjobname 之间的文件夹名称中添加额外的下划线来更改旧的文件夹名称。我们还创建了所有新的文件夹结构,以便以新格式显示,因此不需要更改这些结构。作业编号始终是 1 个字母后跟 4 个数字。客户代码为 3-4 个字母,具体取决于客户。每个作业的作业名称都不同。这些文件夹都位于clients/clientname/jobs/clientcode/"folder that needs to be renamed"(只是脚本必须深入结构的一个示例)。它需要为每个客户端下的每个clientcode 执行此操作。我将如何设置脚本来执行此操作?任何帮助将不胜感激。我们有数千个这样的文件夹需要重命名。

【问题讨论】:

    标签: linux bash rename


    【解决方案1】:

    有一些命令在文件名上的作用类似于 sed;试试mmv(或rename 的perl 变体,又名prename 或rename.PL,你可能在RHEL 上找不到)。

    作为奖励,两者都有-n 选项(无行为),因此您可以检查您将要执行的操作不会破坏或丢失信息。

    【讨论】:

    • RH 重命名与 Debian 重命名不同,在这里不起作用。
    • 有时称为prename
    • 当心:至少有两个完全不同的“重命名”,而 Red Hat 附带的一个会在没有警告的情况下覆盖现有文件。 Larry Wall 的基于 perl 的版本不会这样做(Ubuntu 附带)。
    • 已编辑。额外奖励:vidir,debian/ubuntu 上 moreutils 的一部分。
    【解决方案2】:
    find /path/clients -type d -name "*_?[0-9][0-9][0-9][0-9]*" | while IFS= read -r DIR
    do
        dir=${DIR##*/}
        base=${DIR%/*}
        IFS="_"
        set -- $dir
        front=$1
        back=$2
        jobname=${back#?????}
        jobnum=${back%$jobname}
        newname="${front}_${jobnum}_${jobname}"
        echo mv "$DIR" "$base/$newname"
    done
    

    【讨论】:

      【解决方案3】:

      由于您说名称格式是高度结构化的,并且所有内容都在单亲之下(作为直接或间接的孩子......不确定您提到的内容),我建议这样做:

      为文件夹名称创建一个正则表达式并编写一个小的 perl 脚本,该脚本将与正则表达式匹配目标文件夹(在该文件夹下有要重命名的文件夹)的内容名称。找到匹配项后,将文件夹重命名为新名称。 Perl 让这一切变得简单。

      如果您决定采用这种方法,并且为了以防万一,您不了解 Perl,并且想知道从哪里开始,并且如果您有兴趣在此过程中进行一些学习,我建议您通读这本书“Minimal Perl”...一种快速而有趣的方式来学习这门可怕的语言并将其用于类似于您现在需要的东西。

      希望这会有所帮助。

      【讨论】:

        【解决方案4】:

        也许只有我一个人,但我不太了解目录结构的具体情况,请您在一些代码标签中提供一个示例。

        也许这应该在 serverfault.com 上(但我猜 #!/bin/sh 脚本算作编程)

        编辑:Noufal Ibrahim,抵抗?这是关于使用一种适用于所有 POSIX 兼容版本或 Linux 的方式,也许我很旧,但我拥有的 Solaris 机器不包括 renamemmv。因此,这样的解决方案是不可能的。

        【讨论】:

          【解决方案5】:
          for entry in * ; do
            if [ ! -d "$entry" ] ; then
              continue
            fi
            jobname="${entry##*_?????}"
            dirbase="${entry%$jobname}"
            if [ -z "$dirbase" -o -z "$jobname" ] ; then
              echo "Error with '$entry'"
              continue
            fi
            mv "$entry" "${dirbase}_$jobname"
          done
          

          【讨论】:

            猜你喜欢
            • 2016-08-01
            • 2016-01-25
            • 2013-10-06
            • 1970-01-01
            • 1970-01-01
            • 2012-03-25
            • 2012-09-02
            • 1970-01-01
            • 2011-12-30
            相关资源
            最近更新 更多