关于bash Linux:bash Linux-Massive文件夹重命名

bash Linux - Massive folder rename

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


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

作为奖励,两者都具有-n选项(无作用),因此您可以检查要做什么,而不是破坏事物或丢失信息。


1
2
3
4
5
6
7
8
9
10
11
12
13
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

由于您说的是名称格式,因此结构高度统一,并且所有内容都在单亲之下(无论是直接还是间接的子代。.不确定您所说的内容),我建议这样做:

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

如果您决定采用这种方法,以防万一,您不了解Perl,并且想知道从哪里开始,并且如果您对沿途的学习感兴趣,那么我建议您通读这本书。最小化Perl " ...一种学习怪异语言并将其用于类似于您现在所需要的东西的快速而有趣的方法。

希望这会有所帮助。


也许只是我一个人,但我不太清楚目录结构的样子,请您在一些代码标签中提供一个示例。

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

编辑:努法尔·易卜拉欣,抗拒?这是关于使用一种可在所有POSIX兼容版本或Linux(可能是较旧的版本)上运行的方式,但是我拥有的Solaris计算机不包含renamemmv。因此,这样的解决方案是不可能的。


1
2
3
4
5
6
7
8
9
10
11
12
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