Chinaunix

标题: 求助批量替换文件名中字符串的方法 [打印本页]

作者: fbt045    时间: 2013-02-28 13:52
标题: 求助批量替换文件名中字符串的方法
本帖最后由 fbt045 于 2013-02-28 13:55 编辑

各位大侠,我想把某目录及其子目录中所有含aaa字符串的文件名改为含bbb,比如111aaa222.php改为111bbb222.php,请问该怎么写这条命令啊?
作者: 9ding    时间: 2013-02-28 15:28
你这个重命名包括目录名吗?
作者: 9ding    时间: 2013-02-28 15:34
写了一个脚本代码如下(暂不支持目录重名):
  1. #!/usr/bin/python
  2. # -*- coding: UTF-8 -*-
  3. #filename:rname.py
  4. #date:2013-02-28 by larry
  5. import os,sys
  6. import re
  7. str01=sys.argv[2]
  8. str02=sys.argv[3]

  9. def Vallfile(path):
  10.         for dirnames,dirs,files in os.walk(path,True):
  11.                 for filepath in files:
  12.                         oldname=os.path.join(dirnames, filepath)
  13.                         if str01 in oldname:
  14.                                 newname=re.sub(str01,str02,oldname)
  15.                                 os.rename(oldname,newname)
  16. if __name__=="__main__":
  17.         path =sys.argv[1]
  18.         Vallfile(path)
复制代码
使用方法:python rname.py 目录路径   匹配文件名中的字符串    需要替换成的字符串
操作结果:
[root@OMS tmp]# ll sjk/
总计 4
-rw-r--r-- 1 root root    0 02-28 15:16 ok.txt
drwxr-xr-x 2 root root 4096 02-28 15:29 sjk
[root@OMS tmp]# ll sjk/sjk/
总计 0
-rw-r--r-- 1 root root 0 02-28 15:16 aaaaaaaaaaaaaa.txt
[root@OMS tmp]# python rname.py sjk aaaaaaaaaaaaaa bbbbbbbbbbb
[root@OMS tmp]# ll sjk/sjk/
总计 0
-rw-r--r-- 1 root root 0 02-28 15:16 bbbbbbbbbbb.txt
作者: fbt045    时间: 2013-02-28 17:09
楼上的兄弟,我运行了一下有提示:
Traceback (most recent call last):
  File "rname.py", line 19, in <module>
    Vallfile(path)
  File "rname.py", line 16, in Vallfile
    os.rename(oldname,newname)
OSError: [Errno 2] No such file or directory
这是怎么回事?
作者: 9ding    时间: 2013-02-28 20:04
回复 4# fbt045

脚本没有问题呀,我机器是如下结果,贴出来你操作步骤看看。

[root@OMS tmp]# ll /tmp/sjk/
总计 12
-rw-r--r-- 1 root root    0 02-28 15:16 newfile.txt
drwxr-xr-x 2 root root 4096 02-28 15:29 sjk
drwxr-xr-x 2 root root 4096 02-28 16:12 test123\aaaa
drwxr-xr-x 2 root root 4096 02-28 16:11 test\test99
[root@OMS tmp]# python rname.py   /tmp/sjk/  new  aaaaaaaaa
[root@OMS tmp]# ll /tmp/sjk/
总计 12
-rw-r--r-- 1 root root    0 02-28 15:16 aaaaaaaaafile.txt
drwxr-xr-x 2 root root 4096 02-28 15:29 sjk
drwxr-xr-x 2 root root 4096 02-28 16:12 test123\aaaa
drwxr-xr-x 2 root root 4096 02-28 16:11 test\test99
   
作者: 自由建客    时间: 2013-02-28 20:35
有现成的 rename 命令。
作者: fbt045    时间: 2013-02-28 21:00
自由建客 发表于 2013-02-28 20:35
有现成的 rename 命令。


我知道这个命令,但不知道怎么实现我的具体要求,这种回复一点意义没有
作者: fbt045    时间: 2013-02-28 21:02
9ding 发表于 2013-02-28 20:04
回复 4# fbt045

脚本没有问题呀,我机器是如下结果,贴出来你操作步骤看看。


我试了一下,你的脚本好像只能替换一层子目录,再下层就不行了
作者: fbt045    时间: 2013-03-01 09:19
试了一下find ./ -name "*aaa*" -exec `rename aaa bbb *aaa*` {} \;
在同一目录下可以实现替换,但子目录会有权限问题,难道还得把权限都改掉?
作者: 9ding    时间: 2013-03-01 15:55
回复 8# fbt045


[root@OMS tmp]# ll sjk/sjk/
总计 4
-rw-r--r-- 1 root root    0 02-28 15:16 bbbbbbbbbbb.txt
-rw-r--r-- 1 root root    0 03-01 15:50 old2013-03-01.txt
drwxr-xr-x 3 root root 4096 03-01 15:51 sjk
[root@OMS tmp]# ll sjk/sjk/sjk/sjk/
总计 0
-rw-r--r-- 1 root root 0 03-01 15:51 old2013-03-01.txt
[root@OMS tmp]# python rname.py  sjk/  old2013 new2013
[root@OMS tmp]# ll sjk/sjk/
总计 4
-rw-r--r-- 1 root root    0 02-28 15:16 bbbbbbbbbbb.txt
-rw-r--r-- 1 root root    0 03-01 15:50 new2013-03-01.txt
[root@OMS tmp]# ll sjk/sjk/sjk/sjk/
总计 0
-rw-r--r-- 1 root root 0 03-01 15:51 new2013-03-01.txt


没有问题的呀 我这个是递归遍历所有的目录的,只是在遍历后加了rename操作。


   
作者: yanu    时间: 2013-03-03 00:21
  1. find . -name "*aaa*" -printf "%h\n" | while read line;do cd $line ;rename aaa bbb *aaa*;cd $OLDPWD ;done
复制代码

作者: kuli1    时间: 2013-03-08 00:41
本帖最后由 kuli1 于 2013-03-08 19:47 编辑
  1. #!/bin/bash
  2. for file in `find -name "*aaa*"`
  3. do
  4. oldname=`basename $file`
  5. newname=`echo $oldname | sed 's/aaa/bbb/g' `
  6. mv $file $newname
  7. done
复制代码
随便写的,没调试,就这个意思吧
作者: bh3531    时间: 2013-03-08 17:01
本帖最后由 bh3531 于 2013-03-08 17:04 编辑

可用 find 搜索

find /www/ -name *aaa*.php  这条是能打印 包括目录的文件名,那么 就可以直接使用for

for file in `find /www/ -name *aaa*.php` ;do
          filename=`echo ${file##*/}`    #截取文件名称
       dirname=`echo ${file%/*}`        #截取目录名称
                new_filename=` echo $filename |sed 's/aaa/bbb/'`  #旧名称改新名称
                mv $file ${dirnme}/$new_filename                 #旧文件 移动 新文件
      
done




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2