bash Linux – 大量文件夹重命名

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

Solutions Collecting From Web of "bash Linux – 大量文件夹重命名"

有几个像sed文件名一样的命令; 试试mmv (或者rename的perl变种,也就是prename或者rename.PL,你可能在RHEL上找不到)。

作为一个奖励,两者都有一个-n选项(无行为),所以你可以检查你要做什么不会破坏事情或丢失信息。

 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 

也许这只是我,但我不完全明白如何目录结构看起来像,请你在一些代码标签内提供一个例子。

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

编辑:Noufal易卜拉欣抵抗? 这是关于使用一种适用于所有符合POSIX标准的版本的方法,也可能是Linux版本,但是我不包含renamemmv的Solaris机器。 因此,这样的解决方案是不可能的。

既然你说名字格式是高度结构化的,一切都在一个单一的父母(无论是直接或间接的孩子..不知道你提到的),我会建议这样的:

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

如果你决定采取这种方法,以防万一,你不知道Perl,并想知道从哪里开始,并提供你有兴趣做一些学习,我建议你通读“最小的Perl”一书。 ..一个快速和有趣的方式来学习这个怪异的语言,把它用于类似于你现在需要的东西。

希望这可以帮助。

 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