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 问题,清除文件中的空格,并每两个字符中插入\x