shell学习与使用,边学边用之六!(文件批量复制更名))

在我学习python的时候,我将在ipython中测试的过程通过gnome-screenshot截屏下来保存。
一开始我命名的规则如下:
引用

banxi1988@banxi:~/work/python$ ls images/
assign_py16.png           class_private_var_py06.png     instance_init_py08.png
class_attribute_py02.png  dict_create_py14.png           issubclass_py01.png
class_attribute_py03.png  div_int_py17.png               multiline_str_py12.png
class_attribute_py04.png  factory_function_py09.png      singleton_new_py10.png
class_attribute_py05.png  getattr_frominstance_py11.png  True_False_py15.png
class_docstring_py07.png  inOrnotin_slicing_py18.png     tuple_py13.png
banxi1988@banxi:~/work/python$

后面有一个共同的规则就是pyXX.png这样的。
但是这样在文件查找的时候,序号并不容易清楚的看出来。
所以我想把文件名改为pyxx_some_some.png的方式
如class_attribute_py02.png变为py02_class_attribute.png
为了方便些项操作。
我写了个脚本,通过将这个文件复制到一个新目录时将用新名称命名。
如下
cp dir/fileName newDir/newFileName

基本完成后的脚本如下:
注意是在当前路径执行的。
banxi1988@banxi:~/work/python$ cat fileNameArrange.sh 
#!/bin/bash
# move with name new arrange
#set -x
path='/home/banxi1988/work/python/';
srcdir="images_test/"
dstdir="images_dst/"
if [ ! -d "$srcdir" ]
then
	echo "images_test目录不存在"
	exit 1
fi

if [ -d "$dstdir" ]
then
	echo -n "$dstdir 已经存在,是否需要删除(y/n)?";
	read reply
	reply=`echo $reply | tr [a-z] [A-Z]`
	if [ $reply = Y ]
	then
		echo "正在删除目标目录...";
		rmdir "$dstdir";
		echo "$dstdir目录已经删除!";
		echo "正在创建新目标目录 $dstdir...";
		mkdir "$dstdir";
		echo "$dstdir目录创建成功!";
	else
		echo "您选择了不删除目标目录!"
	fi
fi

# traverse file in srcdir
#set -x
for file in $(ls $srcdir)
do
	#echo "文件:$file"

	fileSuffix=`echo $file| gawk --posix '{ print substr($1,match($1,/py[0-9]{2}/),(length($1) - 4))}'`
	filePrefix=`echo $fileSuffix|gawk '{print substr($1,0,match($1,/\./)-1)}'`
fileName=`echo $file|gawk --posix '{print substr($1,0,match($1,/py[0-9]{2}/)-2)}'`
	newFileName="${filePrefix}_$fileName.png"
	#echo "newFileName:$newFileName"
#set -x
	cp "$srcdir$file"  "$dstdir$newFileName"
#set +x
done



脚本文件分析:
一:
文件目录的存在性判断用在if语句中用的参数。

if [ -d "$dstdir" ] :如果目录存在。
和if [ ! -d "$dstdir" ] :如果目录不存在。
其他可用参数及说明如下:
引用

-w file     用户可写为真
-x file     用户可执行为真
-f file     文件为正规文件为真
-d file     文件为目录为真
-c file     文件为字符特殊文件为真
-b file     文件为块特殊文件为真
-s file     文件大小非0时为真
-t file     当文件描述符(默认为1)指定的设备为终端时为真


二:
文件目录下文件的遍历:
for file in $(ls $srcdir)
do
 ## do some thing
done

有一点是利用了ls命令的功能。
然后是for in语句。


三:字符串抽取与重组
         ## file=class_attribute_py18.png
	fileSuffix=`echo $file| gawk --posix '{ print substr($1,match($1,/py[0-9]{2}/),(length($1) - 4))}'` ## fileSuffix = py18.png
	filePrefix=`echo $fileSuffix|gawk '{print substr($1,0,match($1,/\./)-1)}'`
                  ## filePrefix = py18
fileName=`echo $file|gawk --posix '{print substr($1,0,match($1,/py[0-9]{2}/)-2)}'`
              ## fileName=class_attribute	
newFileName="${filePrefix}_$fileName.png"
## newFileName=py18_class_attribute.png 


上面的的file变量值在注释中的值情况下:
各行代码执行之后对应变量赋值结果如相应后面的注释中的对应所示:
首先在抽取filePrefix提取时。因为提取fileSuffix中gawk中的match提取中的(length($1)-4)没有作用。所以 就多用了一次,因为从前面提取是有用的。
然后awk默认是不支持{}的正则的。所以要开启--posix或者--re-internal选项才可以。

在使用变量时除了$varName的这种方法之处,还可以使用${varName}这种方式。
上面的情况下第一个filePrefix变量必须使用后一种方式。

上面还使用了awk的内置的两个函数。substr()和match()

============未完待续=================

你可能感兴趣的:(shell,脚本,awk,批量更名)