shell脚本:for循环批量重命名含有空格文件名的文件
来源:互联网 发布:淘宝网开店必备技巧 编辑:程序博客网 时间:2024/05/16 03:38
今天在学习shell脚本攻略第二章2.13 批量重命名和移动时,由于我的文件命令有的文件名字中有空格,出现问题
问题代码
#!/bin/bash#图片批量重命名count=1;for img in `find . -name "*.png" -o -name -maxdepth 1 -type f`do echo $count new="img-${count}.${img##*.}" echo renaming $img: $new mv "$img" $new let count++doneIFS=$OLDIFS
最终成功代码
#!/bin/bash#filename: img.sh#图片批量重命名count=0;list=`find . -name "*.jpg" -o -name "*.png" -maxdepth 1 -type f -print`OLDIFS=$IFSIFS=$'\n'for img in $listdo echo $count new="img-${count}.${img##*.}" img=${img// /\\ } echo $img echo $new echo renaming $img: $new eval mv "$img" $new let count=count+1doneIFS=$OLDIFS
寻找最终成果的步骤
步骤一
思路: 由于在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=$IFSIFS=$'\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. 以后命名的时候千万不要在带空格了,很麻烦
- shell脚本:for循环批量重命名含有空格文件名的文件
- 一个批量重命名文件名的shell脚本
- shell 文件名分割,重命名移动批量文件
- shell脚本学习使用for循环批量解压文件
- 文件名批量重命名、文件后缀名批量重命名
- linux 批量 含空格文件名 重命名
- shell脚本实现图片文件的重命名
- 批量重命名,提取文件名、文件后缀名
- shell脚本 for循环迭代文件
- shell下批量出去文件名中的空格
- 文件的批量重命名
- 用shell脚本批量修改目录下的文件名
- 批量修改文件名的脚本bat\python\shell
- Shell 批量重命名以“.log”结尾的文件
- shell脚本----for循环
- shell脚本循环读取参数,文件批量重命名
- Bash中循环遍历文件名中带有空格的文件
- linux -- 批量重命名文件名
- ERROR: value for column "imgfile" exceeds pagesize 1048576! (seg78 192.168.2.7:40000 pid=487967)
- winform判断窗体是否已打开
- 一维数组的创建及使用
- NDK在android studio里的位置
- docker 问题集
- shell脚本:for循环批量重命名含有空格文件名的文件
- java泛型描述
- 抛弃websocket,前端直接打通信道,webRTC搭建音视频聊天
- C语言学习笔记第一篇、内存专题
- HDU 1402 A * B Problem Plus(FFT)
- MRDriver
- SELECT 2 —— 替代SELECT 组件的jQuery 插件
- 【OpenGL】画一个带渲染效果的多边形
- JPA oneToMany