繁体   English   中英

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 (或perl的rename ,aka prename或name.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脚本算作编程了)

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

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

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

如果您决定采用这种方法,以防万一,您不了解Perl,并且想知道从哪里开始,并且如果您对沿途的学习感兴趣,那么我建议您通读“ Minimal 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM