今天做了三个文件。rename1,prefix,suffix。目的是实现批量修改有规则的文件名

rename1放在bin中做为命令使用

prefix,suffix放在/user/local/中被rename1直接调用

rename1文件内容

1 #!/bin/sh
2 while [ true ] ;do \*实现循环 *\
3  echo
4  echo
5  echo
6  ls \*列出当前位置文件名方便修改*\
7  echo
8  select choice in "change prefix" "change suffix" \*select语句选择运行方式*\
9  do
10  case $choice in \*根据用户选择执行相应文件*\
11  "change prefix")
12  /usr/local/prefix \*直接输入文件路径运行文件*\
13  break;;
14  "change suffix")
15  /usr/local/suffix
16  break;;
17  *) \*排除用户输入非法字符*\
18  echo "invalid answer";;
19  esac
20 done
21 done

prefix文件内容

1 #!/bin/sh
2 echo "which part of the filename you want to change"  \*提示用户输入要改的文件名字符串*\
3 read n  \*读取要改的文件名字符串*\
4 echo "what to change"  \*提示用户要将选中文件字符串改成什么样*\
5 read h  \*读取要改成的字符串*\
6 for fname in "$n"*  \*查找含有该字符串的文件*\
7  do  \*循环逐个文件处理*\
8  if [ -f "$fname" ];then  \*判断是否有这个文件存在*\
9  mv "$fname" "$h"${fname##"$n"}  \*有就修改此文件名*\
10  echo "\"$fname\" was changed,now is \""$h"${fname##"$n"}\"" \*友好显示*\
11  else
12  echo "\"no such file\""  \*没有显示无此文件*\
13  fi
14  done
15 echo
16 echo

suffix文件内容  \*内容大概如上*\

#!/bin/sh
2 echo "which part of the filename you want to change"
3 read m
4 echo "what to change"
5 read i
6 for fname in *"$m"  \*双引号为了防止变量为非法*符号导致文件全选*\
7  do
8  if [ -f "$fname" ];then  \*双引号为防止变量为*符号导致出现算法错误*\
9  mv "$fname" ${fname%%"$m"}"$i"  \*双引号为防止变量为*符号导致出现算法错误*\
10  echo "\"$fname\" was changed,now is \"${fname%%"$m"}"$i"\""
11  else
12  echo "\"no such file\""
13  fi
14  done
15 echo
16 echo


学习了awk的批量更改名字方法

有文件

1aa1 2aa2 3aa3 4aa4 ……

要改为1bb1 2bb2 3bb3 4bb4 ……

方法为: ls -l *aa* | awk '{m=$9;gsub(/aa/,"bb",$9);print "mv "m" "$9}'|sh

ls -l *aa* 找到中间字符为aa的文件 -l很重要是$9数值的依据

m=$9 m为$9原先的值

gsub(/aa/,"bb",$9) 将$9中的aa变为bb,此进$9已发生改变

print "mv "m" "$9 打印出格式为 mv m $9的文本,其中m和$9为变量,双引号是标识空格用的

|sh 将mv m $9 送给bash执行,没有这个之前的只打印不执行


ls -l *aa* | awk '{m=$9;gsub(/aa/,"bb",$9);print "mv "m" "$9}'|sh

$9的来源

ls -l *aa* 显示格式如下

-rw-r--r--. 1 root root 0 Nov 18 08:42 1aa1

$1: -rw-r--r--.

$2: 1

$3: root

$4: root

$5: 0

$6: Nov

$7: 18

$8: 08:42

$9: 1aa1

所以这里选择$9