今天在学习shell脚本攻略第二章2.13 批量重命名和移动时,由于我的文件命令有的文件名字中出现空格,出现了许多问题,因此将解决问题的过程记录了下来,希望能够和大家交流学习,共同进步,谢谢!

问题代码

问题代码

最终成功代码

最终代码

步骤一

思路: 由于在shell中运行此脚本时,发现将找到的文件名按照空格分割开来,结果利用for循环时,每一个文件名被打散,例如'./Screenshot from 2017-09-22 14-43-51.png' 拆分成了'./Screenshot\ ' 'from' '2017-09-22'等,所以执行错误. 所以在解决该问题时的第一个思路就是将文件名正确的读出来.

解决方案: 将

`find . -name "*.png" -o -name -maxdepth 1 -type f`

改为

`find . -name "*.png" -o -name -maxdepth 1 -type f -print`

原因: find -print 会将每一个查询出来的文件通过换行符分割开

结果: 依然不行,但是在shell中直接输入该命令,确实是换行输出

步骤二

思路: 虽然输出是换行输出,但是是for循环在读入的时候是从一个大字符串中进行分割,而分割的标识是IFS,IFS默认分隔符是空格\tab\换行,所以会将换行符和空格同样对待,所以需要更改IFS的分割标志.

解决方案:添加代码

OLDIFS=$IFS

IFS=$'\n'

IFS=$OLDIFS

注意: 这里将IFS的分割标志换成了 $'\n' 换行符,如果写成'\n'仅仅表示字母n

结果: 每一次for循环能够得到正确的文件名,但是在执行mv命令时依然报错,原因是文件名中有空格,不能找到正确的文件

步骤三

思路: 在shell中直接执行mv命令,会把文件名中带有空格的文件的文件名的空格进行转译,即将' '转成'\ '.所以这一步的思路就是得到转译之后的文件名

解决方案:添加代码

img=${img// /\\ }

结果: 可以将文件名正确的转换成转译之后的文件名,**但是**依然不能正确运行,shell中提示的错误信息是

mv: cannot stat './Screenshot\ from\ 2017-09-22\ 14-43-51.png': No such file or directory

但是我直接用这个文件名进行mv命令操作是可以进行的,所以这个时候进行最后一步

步骤四

思路: 得到了正确的文件名,但是不能正确的执行mv操作,那么问题就在脚本的这个命令上

mv "$img" $new

所以我在mv前面加上了一个预处理的命令 eval

eval mv "$img" $new

mv命令在执行前会先执行eval命令,将变量的值转换过来,然后在执行,最后得到了正确的结果

知识点

在完成整个文件批量重命名的过程中主要用到了一下几个知识

1. find -print 和-print0

2. IFS 分隔符

3. 字符串替换的方法

4. eval命令

5. 以后命名的时候千万不要在带空格了,很麻烦

6. 因为这次执着于for循环解决,所以花了点时间,简单的可以使用while read line

for循环批量写文件 shell_shell脚本:for循环批量重命名带空格文件名的文件相关推荐

  1. python下载文件并改名_Python 实现自动重命名网易云音乐下载文件

    网易云音乐 PC 版的下载文件都是按照 歌手名 - 歌曲名.mp3 的格式命名的,然而我比较喜欢直接以歌曲名作为文件名.手动一个一个文件改肯定是不行的,太 tm 蠢了(笑 以前我是用 shell 写的 ...

  2. python文件批量重命名以数字~n的方式重命名_利用Python对文件进行批量重命名

    最近几天工作的内容是对40个项目进行考核,每个项目都需要一个考核评分表,已经有了项目的列表. 如果用常规的方法,需要复制40个文件,并逐个修改,不光工作量大,也容易出错,后期修改也不方便. 于是想到了 ...

  3. python批量重命名指定目录下所有文件的后缀名

    python批量重命名指定目录下所有文件的后缀名 有个需求,需要把某个文件夹下所有后缀名为.abc的更改为.xyz; #批量重命名指定目录下面所有文件的后缀名. word_dir为需要更改后缀的文件夹 ...

  4. 批量解压多个zip压缩包并将解压出来的文件以该压缩包的名称重命名

    批量解压多个zip压缩包并将解压出来的文件以该压缩包的名称重命名.bat 复制下面的内容保存成bat文件即可运行: @echo off rem 批量解压多个zip压缩包并将解压出来的文件以该压缩包的名 ...

  5. 怎样批量重命名不同的文件名?

    怎样批量重命名不同的文件名?平时给大家介绍了不少关于文件批量重命名的知识,我们在平时文件重命名的时候大多是将文件按照"名称+序号"的方式进行命名的,但这远远是不够的.还有一部分小伙 ...

  6. R语言rename重命名dataframe的列名实战:rename重命名dataframe的列名(写错的列名不会被重命名)

    R语言rename重命名dataframe的列名实战:rename重命名dataframe的列名(写错的列名不会被重命名) 目录

  7. C# FileSystemWatcher 多文件夹、多文件类型文件监控增加、修改、重命名和删除实例

    在上一次讲过了FileSystemWatcher 实时监控文件的增加.修改.重命名和删除,具体怎么实现就不再去阐述,参考如下文 C# FileSystemWatcher 实时监控文件的增加.修改.重命 ...

  8. SubRenamer – 字幕批量重命名,自动匹配视频文件与字幕文件[Windows]

    简介: SubRenamer 是一款能够为字幕批量重命名的 Windows 工具,它能自动匹配视频文件与字幕文件,并一键批量重命名,以便让视频播放器自动加载对应字幕的 Windows 工具 网盘下载地 ...

  9. 高效搞定文件重命名和归类!使用文件批量改名高手轻松实现

    文件夹管理是计算机使用中非常重要的一项任务,对于个人电脑用户或企业机构来说,都需要对文件夹进行有效管理归类和重命名. 第一步,打开文件批量改名高手,进入文件批量重命名板块并点击添加文件,选择需要重命名 ...

最新文章

  1. 为什么有的系统的事务码BSP_WD_CMPWB看不见Enhance Component这个按钮
  2. SQL Server Window Function 窗体函数读书笔记二 - A Detailed Look at Window Functions
  3. 把文件夹下的所有文件打包成一个zip包
  4. java 爬虫框架_不知道Python爬虫?这篇文章丢给他(内含框架结构)
  5. 对外合作对话国际农民丰收节贸易会 农业农村部谋定稳求进
  6. storm metric的使用说明
  7. streaming接mysql数据库_[Spark streaming举例]-- 实时统计并且存储到mysql数据库中
  8. java中System类、String Builder类简介
  9. python中、文件最重要的功能是( )和接收数据_170道面试题,python让你前尘毋庸
  10. ActiveMQ消息队列的使用
  11. 81-spark异常总结1
  12. 条款一:尽量使用const、inline而不是#define
  13. iOS_SN_详解沙河(转载)
  14. 在苹果Mac上找不到文件存储位置怎么办?
  15. Ubuntu 使用firefox插件下载百度云文件
  16. 动态网站加速,cdn义不容辞
  17. 智能颈部按摩仪设计——2.开发环境搭建
  18. 《断舍离(心灵篇)》-[日]山下英子
  19. 北航计算机学院本科优秀毕业论文,我校荣获32项北京市普通高等学校优秀本科生毕业设计(论文)...
  20. 软件测试之因果图分析

热门文章

  1. Dapr微服务应用开发系列4:状态管理构件块
  2. BeetleX之Websocket服务使用
  3. 跟我一起学.NetCore之路由的最佳实现
  4. 跟我一起学.NetCore之选项(Options)核心类型简介
  5. 认证授权方案之授权初识
  6. 为什么要用内插字符串代替string.format
  7. .NET Core 3.0 新 JSON API - JsonSerializer
  8. 关于WinForms的跨显示器DPI自适应
  9. Ocelot 资源汇总
  10. 领域驱动设计,让程序员心中有码(三)