LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1602|回复: 4

请教,shell 里面有没有转换大小写的函数

[复制链接]
发表于 2006-10-3 08:59:46 | 显示全部楼层 |阅读模式
想批量转换文件名,从大写转为小写,但是不知道有没有这个shell函数。找过man bash,没找到。
 楼主| 发表于 2006-10-3 09:39:27 | 显示全部楼层

搜索到一个

Shell程序批量改名(大写转小写)

首先介绍一下tr命令的一个用法tr string1 string2,
string1/2指定同等数量的字符集合,输入字符在string1中
寻找,若找到,则输出时替换成string2中相应位置的字符。

    代码:

    #! /bin/csh

    if ( $#argv != 1 )

    then

         echo " Usage: $0 -l|-u "

         exit 1

    endif

    if ( "$1" != "-l" && "$1" != "-u" )

    then

         echo " Usage: $0 -l|-u "

         exit 1

    endif

    if ( "$1" == "-l" )

    then

         foreach file ( * )

         mv $file `echo $file | tr '[A-Z]' '[a-z]'`

         end

    else

         foreach file ( * )

         mv $file `echo $file | tr '[a-z]' '[A-Z]'`

         end

    endif


再介绍一下expr string1 : string2命令,string1是待处理
字符串,string2是一个正则表达式,输出将是匹配处理后的结果。
之所以要多费点手脚,因为可能文件名目录名存在特殊字符,
比如空格等,expr string1 : string2这个命令不管文件名目
录名里有没有特殊字符都会输出原始名称。

    代码:

    #! /bin/sh

    if [ $# -ne 1 ]

         then

         echo " Usage: $0 -l|-u "

         exit 1

    fi

    if [ $1 != "-l" -a $1 != "-u" ]

    then

         echo " Usage: $0 -l|-u "

         exit 1

    fi

    if [ "$1" = "-l" ]

    then

         for file in *

         do

              do

                   targetFile=`expr "+++$file" : '+++(.*)' | tr '[A-Z]' '[a-z]'`

                   mv "$file" "$targetFile"

              done

    else

         for file in *

              do

                   targetFile=`expr "+++$file" : '+++(.*)' | tr '[a-z]' '[A-Z]'`

                   mv "$file" "$targetFile"

    done

    fi

    #The End


这里所有的示例都假设只处理了当前子目录下的本层的文件,
如要进行目录树的处理,可以配合使用find命令。上面的
+++仅仅是为了便于匹配处理排除一些干扰因素,没有别的
实际意义。


__________________
=======================

    * 花开不同赏,花落不同悲,
    * 欲问相思处,花开花落时。

=======================

由 mengge 于 02-01-29 16:46 最后编辑

向版主反映这个帖子
回复 支持 反对

使用道具 举报

发表于 2006-10-3 11:20:50 | 显示全部楼层
不说写脚本,只说交互使用,再次推销zsh

autoload -U zmv
zmv '(*)' '${(L)1}'
回复 支持 反对

使用道具 举报

发表于 2006-10-3 23:23:35 | 显示全部楼层
find /path -name "[A-Z]*"|awk '{print "mv "$0,tolower($0)}'|sh
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-4 08:32:41 | 显示全部楼层
谢谢troll、寂寞烈火哦。又学到两招,真高兴。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表