bash Linux - Massive folder rename
在Linux文件服务器(RedHat Enterprise)上,我们需要重命名一些包含客户端工作的文件夹。旧文件夹格式(需要更改的格式)为
有一些命令的作用类似于文件名中的sed。尝试
作为奖励,两者都具有
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 |
由于您说的是名称格式,因此结构高度统一,并且所有内容都在单亲之下(无论是直接还是间接的子代。.不确定您所说的内容),我建议这样做:
为文件夹名称创建一个正则表达式,并针对该正则表达式编写一个与目标文件夹的内容名称相匹配的小型perl脚本(在该文件夹下您将要重命名文件夹)。找到匹配项后,将文件夹重命名为新名称。 Perl使这一切变得容易。
如果您决定采用这种方法,以防万一,您不了解Perl,并且想知道从哪里开始,并且如果您对沿途的学习感兴趣,那么我建议您通读这本书。最小化Perl " ...一种学习怪异语言并将其用于类似于您现在所需要的东西的快速而有趣的方法。
希望这会有所帮助。
也许只是我一个人,但我不太清楚目录结构的样子,请您在一些代码标签中提供一个示例。
也许这应该在serverfault.com上(但我想#!/ bin / sh脚本算作编程了)
编辑:努法尔·易卜拉欣,抗拒?这是关于使用一种可在所有POSIX兼容版本或Linux(可能是较旧的版本)上运行的方式,但是我拥有的Solaris计算机不包含
1 2 3 4 5 6 7 8 9 10 11 12 | 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 |