免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1575 | 回复: 6
打印 上一主题 下一主题

新手写了一个批量重命名的shell,求各位大侠指点 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-28 16:20 |只看该作者 |倒序浏览
学shell一周多,写了一个重命名的,找不到人指导,贴出来让各位大侠指点,以求进步。

#!/bin/bash

  1. # #########################/// autorename.sh \\\###########################
  2. # @version : 1.0
  3. # @since : 2012-05-27 09:10:20
  4. #
  5. # @description :
  6. #     一个自动批量重命名的脚本
  7. # @usage :
  8. #
  9. # @author : jiangtao
  10. # @copyright
  11. # @TODO :
  12. #
  13. # #########################/// autorename.sh \\\###########################

  14. #用来检测脚本的参数

  15. E_WRONG_ARGS=65
  16. script_parameters="FILENAME suffix"
  17.        
  18. declare -i number_of_expected_args=1

  19. if [ $# -lt $number_of_expected_args ]; then

  20.         echo Usage: $(basename $0) $script_parameters
  21.         echo Example: ./$(basename $0) jpg

  22.         # `basename $0`是这个脚本的文件名

  23.         exit $E_WRONG_ARGS
  24. fi

  25. grep_option=
  26. grep_pattern=
  27. GREP=
  28. new_name_pattern="%#"
  29. declare -i auto_change_bits=1
  30. work_dir=./
  31. declare -i count=1

  32. #解析命令行参数

  33. while getopts s:p:n:d:f: opt
  34. do
  35.         case $opt in
  36.                 s)
  37.                         #如果这是jpg后缀的文件名
  38.                         if [ $OPTARG == "jpg" -o $OPTARG == "JPEG" -o        \
  39.                                 $OPTARG == "JPG" -o $OPTARG == "jpeg" ]; then
  40.                                 grep_pattern="jpg$|jpeg$"
  41.                                 grep_option="-iE"
  42.                         fi
  43.                         grep_pattern="$OPTARG$"
  44.                         GREP=grep

  45.                         ;;

  46.                 p)
  47.                         new_name_pattern=$OPTARG
  48.                         #处理默认命名模式
  49.                         if ! echo $new_name_pattern | grep -q '%#' ; then
  50.                                 new_name_pattern="%#$new_name_pattern"
  51.                         fi

  52.                         ;;

  53.                 n)        auto_change_bits=$OPTARG

  54.                         ;;
  55.                 d)
  56.                         work_dir=$OPTARG
  57.                         work_dir=${work_dir/%\//}
  58.                         work_dir=$work_dir/

  59.                         ;;

  60.                 f)
  61.                         count=$OPTARG

  62.                         ;;

  63.                 *)        echo parameter error
  64.                         exit 65
  65.                         ;;
  66.         esac
  67. done
  68. cd $work_dir

  69. if [ -z $GREP ]; then
  70.         rename_files=$(ls -A)
  71. else
  72.         rename_files=$(ls -A | $GREP $grep_option $grep_pattern)
  73. fi
  74. cd -
  75. auto_change_str_prefix=
  76. auto_change_str=

  77. for old_name in $rename_files
  78. do
  79.         declare -i zero_num=$((auto_change_bits - ${#count}))

  80.         if [ $zero_num -gt 0 ]; then
  81.                 for ((i = 0; i < zero_num; i++)); do
  82.                         auto_change_str_prefix=$auto_change_str_prefix$(echo 0)
  83.                 done
  84.         fi
  85.         auto_change_str=$auto_change_str_prefix$(echo $count)
  86.         if [ -z $grep_pattern ]; then
  87.                 new_name=${new_name_pattern//%n/$old_name}
  88.                 new_name=${new_name//%#/$auto_change_str}
  89.         else
  90.                 old_name_no_suffix=${old_name%.*}
  91.                 suffix=${old_name/$old_name_no_suffix}
  92.                 new_name=${new_name_pattern//%n/$old_name_no_suffix}
  93.                 new_name=${new_name//%#/$auto_change_str}$suffix
  94.         fi

  95.         mv $work_dir$old_name $work_dir$new_name

  96.         ((++count))
  97.         auto_change_str_prefix=
  98. done
复制代码
说明:
  1. autorename 使用说明
  2. ver 1.0
  3. ====================

  4. autorename [选项] [参数]

  5. -s
  6.   --suffix        指定要改名的文件后缀名,如果不指定后缀名默认为无后缀名文件
  7.                
  8.                 注意:如果不指定后缀名的话,需要将文件放入一个单独的目录,
  9.                 并通过选项参数指定放入的目录,否则会造成当前目录下文件的名字
  10.                 混乱

  11. -d
  12.   --directory   指定要改名文件的目录,不指定则默认当前目录

  13. -p
  14.   --pattern        重命名的模式,%n代表原文件名,%#代表自动变化的数字,模式的其
  15.                 他部分遵循所见即所得的原则,例如:原文件名是 xxx

  16.                 autorename -p %n%#abc 则重命名的文件名是 xxx1abc xxx2abc 等

  17.                 如果不指定模式默认为 %# 即以数字对文件进行命名,如果指定了模
  18.                 式但没有在模式中指定 %# 则默认在模式的最后面加上 %#

  19.                 例如:autorename -p abc 则默认的文件模式是 abc%#

  20. -n
  21.   --number        重命名模式中 %# 所占的位数,例如:
  22.                
  23.                 autorename -n 2 -p abc_%# 则在文件个数没有超过10个的时候新文件
  24.                 名是 abc_01 abc_02

  25. -f
  26.   --from        重命名模式中 %# 开始的数字
复制代码
就像上面说的那样。我的程序基本是基于后缀名的,不知道怎样在一堆文件中找出没有后缀名的。所以需要把无后缀名的文件
放入一个新的目录中,这点不知道有没有更好的解决办法

论坛徽章:
0
2 [报告]
发表于 2012-05-28 16:33 |只看该作者
美女还是帅哥喔,代码写得不错啊,qq多少啊,交个朋友塞!我的qq129098711,谢谢

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
3 [报告]
发表于 2012-05-28 17:02 |只看该作者
不知道怎样在一堆文件中找出没有后缀名的

这样可以吗?
  1. ls|grep -v '\.'
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-05-28 18:47 |只看该作者
Shell_HAT 发表于 2012-05-28 17:02
这样可以吗?


不行的,遇到文件名中有 . 的就不行了。

我觉得文件名有下面几种情况

xxx
xxx.jpg     或者其他后缀名的
xxx.xxxx  文件名中有 '.' 的
.xxx          隐藏文件

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
5 [报告]
发表于 2012-05-28 19:13 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
6 [报告]
发表于 2012-05-28 21:00 |只看该作者
回复 4# 小鸟飞飞~


    如果我把一文本文件命名为test.jpg,那么你觉得这算是有后缀名还是没有后缀名?

论坛徽章:
0
7 [报告]
发表于 2012-05-28 21:56 |只看该作者
回复 6# Shell_HAT

目前这个脚本肯定把它当有后缀名的来处理了
但是我认为不应该当成有后缀名来处理。。

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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP