`
banxi1988
  • 浏览: 154248 次
  • 性别: Icon_minigender_1
  • 来自: 桂林
社区版块
存档分类
最新评论

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

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

分享到:
评论

相关推荐

    基于Python+ffmpeg实现的视频与文件处理工具源码,可批量对视频进行改名,倍速,提取音频等操作

    这是一个使用Python和ffmpeg库开发的视频处理工具,其主要功能是针对视频文件进行批量操作,如改名、调整播放速度、提取音频以及替换音频。在本文中,我们将深入探讨这个工具涉及的技术点,包括Python编程基础、...

    linux学习手册

    - **cp**:复制文件或目录,用于备份或移动数据。 - **mv**:移动或重命名文件或目录,实现位置调整或改名。 2. **文件系统管理**: - **file系统类型**:如EXT4、XFS等,了解其特性与用途。 - **mount/umount*...

    linux学习文档

    8. **mv**:移动或重命名文件或目录,可以实现文件位置的改变或改名。 9. **touch**:创建新文件或更新文件时间戳,常用于创建新文件。 10. **cat**:查看文件内容,尤其是文本文件。 11. **more** 和 **less**:...

    rename-xcode-files:Shell 脚本可轻松批量重命名 XCode 类、文件等

    例子: MyClassA ZZMyClassAMyClassB ZZMyClassBMyClassC ZZMyClassC##Step #2:将两个文件复制并粘贴到项目目录中,然后运行 ​​shell 脚本。 笔记: 此脚本将更新对在项目文件、XIB 文件、故事板文件、.h 和 .m ...

    AIX shell工具集概述.docx

    1. **批量改名或拷贝文件**:在AIX中,可以利用`ls`、`awk`和`bash`的组合进行文件的批量重命名或复制。例如,将所有以`start.sh`开头的文件更改为`stop.sh`,首先使用`ls -l start*.sh`列出这些文件,然后通过`awk`...

    批量修改文件名

    9. **扩展功能**:一些高级的工具还可能提供额外功能,如批量移动、复制、重命名文件夹,以及与云存储服务集成等。 10. **错误处理**:在批量操作中,可能会遇到重名冲突、权限问题等,优秀的工具会提供相应的错误...

    Python web全栈学习路线.docx

    * 案例:文件批量复制、文件批量改名、宠物寄养管理系统、面向对象版宠物寄养管理系统、文件加密存储软件 模块和包 * 模块介绍 * 包介绍 * import 语句 * from…import…语句 * import…as… 语句 * all 魔术变量 ...

    Linux命令及系统指令

    7. `mv`:移动或重命名文件或目录,用于调整文件位置或改名。 8. `touch`:创建新文件或更新文件时间戳。 9. `cat`:查看文件内容,常用于查看文本文件。 10. `more` 和 `less`:分页查看文件内容,比`cat`更便于大...

    linux教程——很使用的那种

    由于linux中的别名机制,使用rm等价与使用rm -i,这样在删除文件或目录时会有提示,如果不想出现提示内容,需要加选项-f。写脚本的时候需要加上-f,因为批量删除文件或目录不需要每次都提示询问。 在unix中rm删除文件...

    大量批处理实用程序例程

    本资源由大量的实用批处理文件组成,删除.txt尾缀名双击即可直接使用,既是学习的模板也可以作为实用程序,如下为文件组成,涉及文件管理,系统,网络,小工具等等: 0-reaname 2000XP停止打印.bat BAT珍藏 dir.bat...

    Linux系统基本命令

    - 实战场景:批量处理某一类文件,例如备份所有文本文件。 - **diff**:比较两个文件的内容差异。 - 示例命令:`diff file1.txt file2.txt` - 作用:显示两个文本文件之间的不同之处。 - 实战场景:检查文件...

    Linux命令大全(必读).rar

    Linux是世界上最受欢迎的开源操作系统之一,它以其稳定性和灵活性闻名。对于任何想要深入理解或在IT领域工作的个人来说,掌握Linux命令行技能是至关重要的。"Linux命令大全(必读).rar"这个压缩包文件提供了全面的...

    700个批处理打包下载.rar

    改名复制文件.cmd 文件备份器V2.3修改版2.cmd 文件夹伪装.TXT 文件归类整理器 V1.1(子目录版).bat 文件归类整理器 V1.1(指定路径带子目录版).bat 文件归类整理器(当前目录版).bat 文件数目分类统计.cmd 断开网络联结...

    牛新庄:DB2使用经验

    - **用CLI编程批量的INSERT**:使用CLI(Call Level Interface)进行批量插入操作,提高效率。 #### 三、DB2一些不好的限制 - **临时表不能建索引**:在DB2中,临时表不支持创建索引,因此可能会影响某些场景下的...

    LinuxSSH命令大全(20210930123859).pdf

    Linux SSH(Secure Shell)命令是Linux系统中用于远程管理和交互的主要工具,它提供了一种安全的方式来连接和控制远程服务器。以下是一些常见的SSH命令及其详细解释: 1. `rm -rf mydir` - 这个命令会删除名为mydir...

    DB2使用经验积累

    26. **用CLI编程批量的insert**:可以使用DB2 CLI(Client Library)提供的`SQLBulkOperations`功能来实现批量插入操作。 #### 三、DB2一些不好的限制 - **临时表不能建索引**:在DB2中,临时表无法建立索引,这...

    DB2数据库用户手册

    - **用CLI编程批量的INSERT**:使用CLI编程时,可以通过批处理命令来提高插入性能。 #### 三、DB2的一些不好的限制 - **临时表不能建索引**:DB2中的临时表不允许建立索引。 - **CURSOR不能定义为WITH UR**:尽管在...

    易语言程序免安装版下载

    操作系统界面功能支持库(shell.fne)中的“执行()”命令增加一个参数“窗口显示方式”,作用与核心库“运行()”命令的同名参数一致。 6. 数据库操作支持库增加读写长整数字段的功能,但受限于系统接口暂不能读写...

Global site tag (gtag.js) - Google Analytics