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

在我学习python的时候,我将在ipython中测试的过程通过gnome-screenshot截屏下来保存。
一开始我命名的规则如下:
[quote]
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$
[/quote]
后面有一个共同的规则就是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" ] :如果目录不存在。
其他可用参数及说明如下:
[quote]
-w file     用户可写为真
-x file     用户可执行为真
-f file     文件为正规文件为真
-d file     文件为目录为真
-c file     文件为字符特殊文件为真
-b file     文件为块特殊文件为真
-s file     文件大小非0时为真
-t file     当文件描述符(默认为1)指定的设备为终端时为真
[/quote]

二:
文件目录下文件的遍历:

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()

============未完待续=================
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值