初学shell,为了练习sed,写了个简单的批量修改文件名的脚本,后来执行时发现系统竟然自带有一个rename命令,顺便也记下了

  1 #!/bin/bash
  2 <<Comment
  3 批量修改文件名的脚本
  4 2015/10/24
  5 webber
  6 Comment
  7 ARGS=2
  8 ONE=1
  9 if [ $# -ne "$ARGS" ];then
 10   echo "传参错误!!"
 11   exit 2
 12 fi
 13
 14 num=0
 15
 16 for file in *$1*
 17 do
 18   if [ -f "$file" ];then
 19     fname=`basename "$file"`  #或者fname='echo "$file"'  包含$1的字符串的整个文件名赋值给fname 此处要用命令替换符``
 20     newname=`echo $fname | sed -e "s/$1/$2/g"`  #把新的文件名替换给旧的文件名的$1部分
 21     mv "$fname" "$newname"
 22     let num++
 23   fi
 24 done 2> error.txt #把标准错误输出到error.txt中
 25
 26 if [ -s error.txt ];then    #如果error.txt文件存在且不为空 那么提前结束退出
 27   echo "有错误发生,请检查error.txt文件"
 28   exit 3
 29 fi
 30
 31 if [ "$num" -eq "$ONE" ];then
 32   echo "$num file has been renamed"
 33 else
 34   echo "$num files have been renamed"
 35 fi
 36
 37 rm error.txt &> /dev/null  #文件名被成功修改后,要把错误文件信息删除

 38 exit 0

     汗~~~由于最近才开始学,``的用法还不熟悉,导致当时往 mv 里面传参的时候总数报错,说无法获取"basename \"$file\"" 的文件状态(stat): 没有那个文件或目录,然后把mv改成了echo试试,发现参数根本就没传递过来,这才发现要用``来进行命令转换,这与$()的作用是一样的,都是把其中的执行结果赋值给另一个变量,我在网上看有人说根据POSIX规范,推荐多用$()的形式,那以后就多用这种形式吧。

     后来在执行的时候,发现系统竟然自带rename这个命令,于是man了一下,发现差不多,给的例子是:

              假如目录下现有如下文件:

              foo1,....... foo9,,,.foo10, ..., foo278
参考命令:
              rename foo foo0 foo?
              rename foo foo0 foo??

   你将会修改成如下文件名:

               foo001, ..., foo009, foo010, ..., foo278.

百度了一下别人的,命令格式大概这样:

        第一个参数:被替换掉的字符串

        第二个参数:替换成的字符串

        第三个参数:匹配要替换的文件模式

而且,介绍了 rename .htm .html *.htm  这一命令 ,应该是rename还可以修复你的html文件的扩展名。

      以上有任何问题希望各位前辈指正。


 

posted @ 2015-10-24 20:22  webber_liu  阅读(765)  评论(0编辑  收藏  举报