求助:如何批量修改文件夹及文件夹下文件的名字

sh/bash/dash/ksh/zsh等Shell脚本
回复
天梯梦
帖子: 6
注册时间: 2012-08-07 2:20

求助:如何批量修改文件夹及文件夹下文件的名字

#1

帖子 天梯梦 » 2015-11-13 5:30

假如我有一个文件夹,文件夹下面有一些文件,如下所示:

Gideon/gideon_lisha/Gideon_samuel/Gideon_nathan.xml

我当前是在根目录Gideon的文件夹,我想写一段shell代码,这个文件夹及文件夹下的所有 Gideon 更换成 Liang,我要的结果如下:

Liang/Liang_lisha/Liang_samuel/Liang_nathan.xml

我用过如下代码:

replace_file_names.sh

代码: 全选

#!/bin/bash

path=$1
filename=$2
newfilename=$3

echo "We are finding '$filename' under the folder '$path'"

count=1
for i in `find $path -iname *$filename*`
do
    newpath=`echo $i | sed "s/$filename/$newfilename/g"`
    sudo mv "$i" "$newpath"
    echo "${count}: Renaming $i to $newpath"
    let count++
done
那么问题来了,当我使用 replace_file_names.sh . gideon Liang的时候,因为路劲是Gideon/gideon_lisha/Gideon_samuel/Gideon_nathan.xml,那么它自动修改了先修改成了Liang/gideon_lisha/Gideon_samuel/Gideon_nathan.xml,后面的路径就因为文件夹名称的改变无法执行,也就是说,它只运行到根目录! 我不知道如果写一段代码,可以让执行顺序从最内层往最外层运行,所以求教大家!


另外,复杂点的话,如果根目录Gideon下面不止一个文件夹的话,那么就更麻烦了,例如:


Gideon/gideon_lisha/Gideon_samuel/Gideon_nathan.xml
Gideon/lisha_gideon/Gideon_noah.xml
...


求助!非常感谢!
头像
susbarbatus
帖子: 2966
注册时间: 2010-04-10 16:14
系统: Arch Linux

Re: 求助:如何批量修改文件夹及文件夹下文件的名字

#2

帖子 susbarbatus » 2015-11-13 10:54

改了四个地方:
1. find $path -iname "*$filename*" ,加了个引号;
2. find $path -iname "*$filename*" | tac,后 find 到的行在前;
3. sed "s@\(.*\)$filename@\1$newfilename@ ,除红色增加部分外删除了最后的 g,只替换最后的匹配;
4. sed "s@\(.*\)$filename@\1$newfilename@" ,sed 的分隔符改成 @,防止与文件路径中的 / 冲突。

以上 2、3 是为了逻辑的修改,1、4 是楼主的粗心,
还有一点,Gideon/gideon_lisha/Gideon_samuel/Gideon_nathan.xml,
这个 sample 中有小写, find 用的是 -iname 也是无视大小写的,但 sed 的替换是大小写有关的,
大小写我暂时没处理,因此 -iname 也改成 -name 了,这样可以分两次分别将 Gideon 替换成 Liang,gideon 替换成 liang 之类,
楼主最好明确一下需求。

代码: 全选

#!/bin/bash

path=$1
filename=$2
newfilename=$3

echo "We are finding '$filename' under the folder '$path'"

count=1
for i in `find $path -name "*$filename*" | tac`
do
    newpath=`echo $i | sed "s@\(.*\)$filename@\1$newfilename@"`
    sudo mv "$i" "$newpath"
    echo "${count}: Renaming $i to $newpath"
    let count++
done
上次由 susbarbatus 在 2015-11-13 11:23,总共编辑 1 次。
沉迷将棋中……
头像
susbarbatus
帖子: 2966
注册时间: 2010-04-10 16:14
系统: Arch Linux

Re: 求助:如何批量修改文件夹及文件夹下文件的名字

#3

帖子 susbarbatus » 2015-11-13 11:17

还是补充一下处理大小写的版本吧,无论是大小写的 gideon 最后都会被替换成 Liang,看起来这个比较对得上第一个 sample,
就是 sed 的结尾追加了个 i :

代码: 全选

#!/bin/bash

path=$1
filename=$2
newfilename=$3

echo "We are finding '$filename' under the folder '$path'"

count=1
for i in `find $path -iname "*$filename*" | tac`
do
    newpath=`echo $i | sed "s@\(.*\)$filename@\1$newfilename@i"`
    sudo mv "$i" "$newpath"
    echo "${count}: Renaming $i to $newpath"
    let count++
done
沉迷将棋中……
天梯梦
帖子: 6
注册时间: 2012-08-07 2:20

Re: 求助:如何批量修改文件夹及文件夹下文件的名字

#4

帖子 天梯梦 » 2015-11-13 13:07

@susbarbatus: 你太牛了!果然好使,非常感谢!
回复