当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 求助:如何批量修改文件夹及文件夹下文件的名字
帖子发表于 : 2015-11-13 5:30 

注册: 2012-08-07 2:20
帖子: 6
送出感谢: 2
接收感谢: 0 次
假如我有一个文件夹,文件夹下面有一些文件,如下所示:

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
...


求助!非常感谢!


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 求助:如何批量修改文件夹及文件夹下文件的名字
帖子发表于 : 2015-11-13 10:54 
头像

注册: 2010-04-10 16:14
帖子: 2903
系统: Arch Linux
送出感谢: 8
接收感谢: 69
改了四个地方:
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


_________________
dz,U,EIS. cies.
dz-cies@github
小香猪杀手@cc98.org


最后由 susbarbatus 编辑于 2015-11-13 11:23,总共编辑了 1 次

页首
 用户资料  
 
3 楼 
 文章标题 : Re: 求助:如何批量修改文件夹及文件夹下文件的名字
帖子发表于 : 2015-11-13 11:17 
头像

注册: 2010-04-10 16:14
帖子: 2903
系统: Arch Linux
送出感谢: 8
接收感谢: 69
还是补充一下处理大小写的版本吧,无论是大小写的 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


_________________
dz,U,EIS. cies.
dz-cies@github
小香猪杀手@cc98.org



_________________
评价: 3.7% 天梯梦
 
页首
 用户资料  
 
4 楼 
 文章标题 : Re: 求助:如何批量修改文件夹及文件夹下文件的名字
帖子发表于 : 2015-11-13 13:07 

注册: 2012-08-07 2:20
帖子: 6
送出感谢: 2
接收感谢: 0 次
@susbarbatus: 你太牛了!果然好使,非常感谢!


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 4 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译