在我们的 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
在每个客户下。我将如何设置脚本来执行此操作?任何帮助将不胜感激。我们有成千上万个需要重命名的文件夹。
5 回答
有一些命令在文件名上的作用类似于 sed;尝试mmv
(或 perl 的变体rename
,又名 prename 或 rename.PL,您可能在 RHEL 上找不到)。
作为奖励,两者都有一个-n
选项(不采取行动),因此您可以检查您将要做的事情不会破坏事物或丢失信息。
因为您说名称格式是高度结构化的,并且所有内容都在单亲之下(作为直接或间接的孩子......从你提到的内容中不确定),我建议这样:
为文件夹名称创建一个正则表达式并编写一个小的 perl 脚本,该脚本将与正则表达式匹配目标文件夹(在该文件夹下有要重命名的文件夹)的内容名称。找到匹配项后,将文件夹重命名为新名称。Perl 使这一切变得简单。
如果您决定采用这种方法,并且为了以防万一,您不了解 Perl 并且想知道从哪里开始,并且如果您有兴趣在此过程中进行一些学习,我建议您阅读“Minimal Perl”一书。 ..一种快速而有趣的方式来学习可怕的语言并将其用于类似于您现在需要的东西。
希望这可以帮助。
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
. 因此,这样的解决方案是不可能的。
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