[英]bash Linux - Massive folder rename
在我们的Linux文件服务器(RedHat Enterprise)上,我们需要重命名一些包含客户端工作的文件夹。 旧的文件夹格式(需要更改的格式)为clientcode_jobnumberjobname
。 新格式为clientcode_jobnumber_jobname
。 我们基本上需要通过在jobnumber
和jobname
之间的文件夹名称中添加额外的下划线来更改旧文件夹的名称。 我们还拥有所有要创建的新文件夹结构,以新格式显示,因此无需更改它们。 职位编号始终为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计算机不包含rename
或mmv
。 因此,这种解决方案是不可能的。
因为您说的是名称格式高度结构化,并且所有内容都在单亲下(无论是直接还是间接的子代,..不确定您所说的内容),所以我建议这样做:
为文件夹名称创建一个正则表达式,并针对该正则表达式编写一个小的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.