linux问题解决:Shell中处理包含空格的文件名

Posted 河边小咸鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux问题解决:Shell中处理包含空格的文件名相关的知识,希望对你有一定的参考价值。

  今天在写脚本的时候碰见了一个问题,在使用脚本对一些文件进行权限更改的时候,报出了意料之外的错误。经过对相关内容的查看,发现罪魁祸首是文件名中的空格。

下面在我的服务器上进行复现:

  • 首先是touch一个名字里带空格的文件,这里我新建的是文件test 1,如下图。
  • 随后是以常规命令chmod 777 test 1来对其进行权限更改操作,如下图。
  • 可以看到,test 1被理解为了两个文件,所以操作失败,提示这两个文件不存在。对于这种情况,很明显需要加上引号来提示系统这是一个整体,或是加上\\来对空格进行转义,如下图可以看到命令成功的被执行了。
  • 但是,对于shell脚本来讲没有办法这么简单的处理,尤其是脚本中需要修改的文件是通过find找出来的变量。由此遇到困难开始想办法解决。

关于解决此问题的思考:

  • 首先脚本中没有办法添加引号来使得变量被划为一个整体,所以单独操作时最常用的引号无法使用。
  • 其次是否可以通过shell里的字符串函数在文件名中加入转义符\\来避免空格的影响,但是我觉得这个应该会影响处理速度。
  • 最后能否从根本上直接解决问题,即将文件名中的空格先替换为别的内容,待处理完后再替换为空格。这个说实话我感觉有点麻烦,而且最重要的是在替换时选择替换为什么内容?如果替换的内容本来就在文件名中存在,那么可能在替换回去时会改变原文件名,所以我觉得这个应该不大可行。

最终解决方案:
  我在网上冲浪了一会,发现一个应该是效率最高改动最小的解决方案,即修改解释器的单词分隔符。这个东西在bash中被储存在变量$IFS中,初始值为\\n\\t,即空格、回车、tab。在bash处理内容时会根据这个变量来对字符串进行分割,所以对其中的内容进行修改删去空格,即可让bash在处理带空格字符串时,不进行分割,从而从根本上解决问题。当然在脚本执行后还得把$IFS改回去,避免之后出现问题。
  相比上文思考中的更改字符串,我觉得还是这个更方便效率高,所以决定使用这个方法对问题进行处理。

  • 这是我更改后的代码实例,其中把分隔符IFS改为了\\n\\b,待脚本执行完毕后再切回原来的\\n\\t,从而在不影响bash的情况下完成IFS的更改。
#!/bin/bash
#由于文件名中可能有空格,所以需要更改IFS

SAVEIFS=$IFS
IFS=$(echo -en "\\n\\b")

for file in `find ~ -perm -002 -type f 2>/dev/null`
do
    chmod o-wx "$file"
done

IFS=$SAVEIFS
  • 这是运行后的结果。可以发现,权限已经被成功的修改了。由此可以验证该写法,对于文件名包含空格的文件和文件名含\\\\的文件都可以成功的进行选取,从而正确的解决命令。
  • 如果不更改IFS的话,就会出现下面这个问题,所以我认为该问题已解决。

以上是关于linux问题解决:Shell中处理包含空格的文件名的主要内容,如果未能解决你的问题,请参考以下文章

linux shell 问题,清除文件中的空格

linux shell 问题,清除文件中的空格,并每两个字符中插入\x

Linux(shell)遍历目录删除指定文件,解决文件夹名称带空格问题

linux shell 中 如何处理空格的路径?

Linux如何查找处理文件名后包含空格的文件

execl打开linux下cvs文件乱码问题解决办法