美文网首页
shell脚本:for循环批量重命名带空格文件名的文件

shell脚本:for循环批量重命名带空格文件名的文件

作者: Snowbear | 来源:发表于2017-10-11 23:56 被阅读0次

    今天在学习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

    相关文章

      网友评论

          本文标题:shell脚本:for循环批量重命名带空格文件名的文件

          本文链接:https://www.haomeiwen.com/subject/aoygyxtx.html