ChinaUnix.net
 >> ChinaUnix.net > Linux

很方便的两个shell script......

作者:juner     发表时间:2002/03/17 11:41pm


   最近我把系统重作了一下,于是成了 WIN98 和 linux 共存的系统, 但工作久了,发现很不方便(在 WIN98 下的文件名都是大写,而 linux 下的文件名一般都是小写字符)。在使用 mcopy 的时候,拷过来的文件名都是大写的,很不方便 linux 操作!
   于是就写了两个shell脚本,这几天我用它们方便了许多操作,现在拿出来给双系统的朋友分享(我知道,像我这样用双系统的人很多哟! ;-) ),应该有人能用上它。 脚本很简单,不过在发此贴之前把它们包装了一下(这样看起来就像个系统命令了,呵呵)。不足的是,只能改当前的目录中的文件名(就是说,只可以:% upks2lowks * 或 % upks2lowks myfile, 而不能 % upks2lowks /mydir/myfile),其实后者也可以,不过会有错信息输出!

脚本内容如下:

#!/bin/sh

# This Shell Script can change UPPER-CASE FILENAME to low-case filename.

error=0;count=0
number=$(echo * | /usr/bin/wc -w)

if [ "$1" = "-h" -o "$1" = "--help" ]; then
 echo "Usage: upks2lowks [PATH] [FILENAME]..."
 echo "Description: Change \"FILENAME\" to \"filename\"!"
 echo ""
 echo "  -h, --help               display this info and exit"
 echo "  -v, --version            display version info and exit"
 echo ""
 echo "Report bugs to <sea___sky@sina.com>."
 echo "PS: I think U can modify it by nothing! It's just a shell script! ;-)"
 exit
fi

if [ "$1" = "-v" -o "$1" = "--version" ];then
 echo "A tool form my file-utils, no version info!"
 echo "(maybe ver0.0.0)?! (^o^)"
 echo "Written by Juner.L"
 echo ""
 echo "Copyright (C) Juner"
 echo "This is free software; see the source for copying conditions.  There is NO"
 echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
exit
fi

if [ -z "$1" ]; then
 /usr/bin/printf "\a"
 echo "Just put the \"FILENAME\" follow the command!"
else
 for i in $*
 do
   if [ -e "$i" -a -w "$i" ]; then
     file=$(echo $i | /usr/bin/tr "[A-Z]" "[a-z]")
     if [ "$i" = "$file" ]; then
       echo "The file \"$i\" is already lowcased!"
       count=$(/usr/bin/expr 1 + $count)
     else
       echo "$i => $file"
       /bin/mv -f $i $file 2> /dev/null
     fi
   else
   echo "warning: file \"$i\" not exist OR you have no \"w\" right to file!"
   fi
 done
 if [ "$number" -eq "$count" ]; then
   echo "    all file(s) is lowcased!"
 else
   echo "    $count file(s) already lowcased!"
 fi
fi

   还有一个和它差不多,只改了几个小地方,是把小写的文件名改成大写的,如下:

#!/bin/sh

# This Shell Script can change low-case filename to UPPER-CASE filename.

error=0;count=0
number=$(echo * | /usr/bin/wc -w)

if [ "$1" = "-h" -o "$1" = "--help" ]; then
 echo "Usage: lowks2upks [path] [filename]..."
 echo "Description: Change \"filename\" to \"FILENAME\"!"
 echo ""
 echo "  -h, --help               display this info and exit"
 echo "  -v, --version            display version info and exit"
 echo ""
 echo "Report bugs to <sea___sky@sina.com>."
 echo "PS: I think U can modify it by nothing! It's just a shell script! ;-)"
 exit
fi

if [ "$1" = "-v" -o "$1" = "--version" ];then
 echo "A tool form my file-utils, no version info!"
 echo "(maybe ver0.0.0)?! (^o^)"
 echo "Written by Juner.L"
 echo ""
 echo "Copyright (C) Juner"
 echo "This is free software; see the source for copying conditions.  There is NO"
 echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
exit
fi

if [ -z "$1" ]; then
 /usr/bin/printf "\a"
 echo "Just put the \"filename\" follow the command!"
else
 for i in $*
 do
   if [ -e "$i" -a -w "$i" ]; then
     file=$(echo $i | /usr/bin/tr "[a-z]" "[A-Z]")
     if [ "$i" = "$file" ]; then
       echo "THE FILE \"$i\" IS ALREADY UPPERCASED!"
       count=$(/usr/bin/expr 1 + $count)
     else
       echo "$i => $file"
       /bin/mv -f $i $file 2> /dev/null
     fi
   else
   echo "WARING: FILE \"$i\" NOT EXIST or YOU HAVE NO \"w\" RIGHT TO FILE!"
   fi
 done
 if [ "$number" -eq "$count" ]; then
   echo "    ALL FILE(S) IS UPPERCASED!"
 else
   echo "    $count FILE(S) ALREADY UPPERCASED!"
 fi
fi

   完了!


此文章相关评论:
该文章有3个相关评论如下:(点这儿可以发表评论)
wind521 发表于: 2002/03/18 10:12am
好人呀!谢谢
 
juner 发表于: 2002/03/24 02:38pm
[这个贴子最后由juner在 2002/03/24 09:41pm 编辑]

   经过进一步了解 gawk ,我已经把上面两个脚本优化了,改过后的脚本可以在任意目录下改任意目录(你有写权限的目录/文件)下的文件名,
也就是说,可以在任意目录下
% upks2lowks /home/juner/tmp/*
而不必
% cd /home/juner/tmp/
% upks2lowks *

   改后的 shell script 如下:
  (如果命令路径和你机器上的不一样,改成一样的就行了)

--------------------------------------
#!/bin/sh

# This Shell Script can change UPPER-CASE filename to low-case filename.

# init the vars!

error=0;count=0
number=$(echo $* | /usr/bin/wc -w)

# end of the "init the vars"!


# process the parameter(s)!

if [ "$1" = "-h" -o "$1" = "--help" ]; then
 echo "Usage: $0 [PATH] [FILENAME]..."
 echo "Description: Change \"FILENAME\" to \"filename\"!"
 echo ""
 echo "  -h, --help               display this info and exit"
 echo "  -v, --version            display version info and exit"
 echo ""
 echo "Report bugs to <sea___sky@sina.com>."
 echo "PS: I think U can modify it by nothing! It's just a shell script! ;-)"
 exit 0
fi

if [ "$1" = "-v" -o "$1" = "--version" ];then
 echo "upks2lowks (a tool form my file-utils) ver0.1a"
 echo "Written by Juner.L"
 echo ""
 echo "Copyright (C) Juner"
 echo "This is free software; see the source for copying conditions.  There is NO"
 echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
exit 0
fi

# end of the "process the parameter(s)"!


# working part!

if [ -z "$1" ]; then
 /usr/bin/printf "\a"
 echo "Just put the \"FILENAME\" follow the command!"
else
 for i in $*
 do
   declare -x filez=$(echo $i | /bin/awk BEGIN'{FS="/"} {print $NF}')
   pathz=$(echo $i | /bin/awk BEGIN'{FS=ENVIRON["filez"]} {print $1}')
   if [ -e "$i" -a -w "$i" ]; then
     file=$(echo $filez | /usr/bin/tr "[A-Z]" "[a-z]")

#不好意思,刚发帖的时候直接把上面的粘贴过来,把 "$i" 改成 "$filez" 给忽略了,我现在改过来(不过下边的那个没错)

     if [ "$filez" = "$file" ]; then
       echo "The file \"$i\" is already lowcased!"
       count=$(/usr/bin/expr 1 + $count)
     else
       echo "$pathz$filez => $pathz$file"
       /bin/mv -f $pathz$filez $pathz$file 2> /dev/null
     fi
   else
   echo "warning: file \"$i\" not exist OR you have no \"w\" right to file!"
   fi
 done
 if [ "$number" -eq "$count" ]; then
   echo "    all file(s) is lowcased!"
 else
   echo "    $count file(s) already lowcased!"
 fi
fi

# end of the "working part"!
--------------------------------------

另一个文件也是这么改,道理是一样的。

--------------------------------------
#!/bin/sh

# This Shell Script can change low-case filename to UPPER-CASE filename.

# init the vars!

error=0;count=0
number=$(echo $* | /usr/bin/wc -w)

# end of the "init the vars"!


# process the parameter(s)!

if [ "$1" = "-h" -o "$1" = "--help" ]; then
 echo "Usage: $0 [path] [filename]..."
 echo "Description: Change \"filename\" to \"FILENAME\"!"
 echo ""
 echo "  -h, --help               display this info and exit"
 echo "  -v, --version            display version info and exit"
 echo ""
 echo "Report bugs to <sea___sky@sina.com>."
 echo "PS: I think U can modify it by nothing! It's just a shell script! ;-)"
 exit 0
fi

if [ "$1" = "-v" -o "$1" = "--version" ];then
 echo "lowks2upks (a tool form my file-utils) ver0.1a"
 echo "Written by Juner.L"
 echo ""
 echo "Copyright (C) Juner"
 echo "This is free software; see the source for copying conditions.  There is NO"
 echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
exit 0
fi

# end of the "process the parameter(s)"!


# working part!

if [ -z "$1" ]; then
 /usr/bin/printf "\a"
 echo "Just put the \"filename\" follow the command!"
else
 for i in $*
 do
   declare -x filez=$(echo $i | /bin/awk BEGIN'{FS="/"} {print $NF}')
   pathz=$(echo $i | /bin/awk BEGIN'{FS=ENVIRON["filez"]} {print $1}')
   if [ -e "$i" -a -w "$i" ]; then
     file=$(echo $filez | /usr/bin/tr "[a-z]" "[A-Z]")
     if [ "$filez" = "$file" ]; then
       echo "THE FILE \"$i\" IS ALREADY UPPERCASED!"
       count=$(/usr/bin/expr 1 + $count)
     else
       echo "$pathz$filez => $pathz$file"
       /bin/mv -f $pathz$filez $pathz$file 2> /dev/null
     fi
   else
   echo "WARING: FILE \"$i\" NOT EXIST or YOU HAVE NO \"w\" RIGHT TO FILE!"
   fi
 done
 if [ "$number" -eq "$count" ]; then
   echo "    ALL FILE(S) IS UPPERCASED!"
 else
   echo "    $count FILE(S) ALREADY UPPERCASED!"
 fi
fi

# end of the "working part"!
--------------------------------------

   但是,"declare -x filez=$(echo $i | /bin/awk BEGIN'{FS="/"} {print $NF}')" 一句中的 "declare" 在 cygwin 下的 sh 就认不出来了,我不知道其他版本的会不会有问题(我用的是 Red Hat 6.2)。其实,如果不行也可以把"declare -x " 换成 " && export filez " 就行了。

 
knetfox 发表于: 2002/03/24 08:21pm
老兄,,水平可以呀!
 
 

Copyright © ChinaUnix.net  *  转载请注明出处及作者