在我们的Linux文件服务器(RedHat Enterprise)上,我们有一些文件夹需要重命名才能让客户端工作。旧文件夹格式(需要更改的格式)为clientcode_jobnumberjobname
。新格式为clientcode_jobnumber_jobname
。我们基本上需要通过在jobnumber
和jobname
之间的foldername中添加额外的下划线来更改旧文件夹名称。我们还创建了所有新文件夹结构,以便以新格式显示,因此不需要更改这些结构。作业编号始终为1个字母,后跟4个数字。客户端代码为3-4个字母,具体取决于客户端。每个工作的工作名称都不同。这些文件夹都位于clients/clientname/jobs/clientcode/"folder that needs to be renamed"
(只是脚本进入结构的深度的一个示例)。它需要为每个客户端下的每个clientcode
执行此操作。我如何设置脚本来执行此操作?任何帮助都会得到很大的帮助。我们需要重命名数千个这样的文件夹。
答案 0 :(得分:7)
有一些命令就像文件名上的sed一样;试试mmv
(或rename
的perl变体,也就是prename或rename.PL,你可能在RHEL上找不到。)
作为奖励,两者都有-n
选项(不行动),因此您可以检查您要做的事情是不会破坏事物或丢失信息。
答案 1 :(得分:0)
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
答案 2 :(得分:0)
也许只是我,但我不太确切地了解目录结构的样子,请你在一些代码标签中提供一个例子。
也许这应该在serverfault.com上(但我想#!/ bin / sh脚本算作编程)
编辑:Noufal Ibrahim,抗拒?它是关于使用适用于所有POSIX兼容版本或Linux的方法,可能是现在的,但Solaris机器我不包括rename
或mmv
。因此,这种解决方案是不可能的。
答案 3 :(得分:0)
因为你说名称格式是高度结构化的,并且所有内容都在单个父项下(作为直接或间接的孩子......不确定你提到的内容),我建议:
为文件夹名称创建一个正则表达式,并编写一个小的perl脚本,该脚本与正则表达式的目标文件夹(在其下具有要重命名的文件夹的内容)的内容名称相匹配。获得匹配后,将文件夹重命名为新名称。 Perl使这一切变得简单。
如果您决定采用这种方法,以防万一,您不知道Perl并且想知道从哪里开始,如果您有兴趣在此过程中进行一些学习,我建议您阅读“Minimal”一书Perl“......一种快速而有趣的方式来学习这种可怕的语言并将其用于类似于你现在所需的东西。
希望这有帮助。
答案 4 :(得分:0)
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