为 bash 转义文件名
来源:互联网 发布:海贼王霸气败笔知乎 编辑:程序博客网 时间:2024/05/16 12:15
http://blog.csdn.net/shell_picker/article/details/7415030
最近遇到的一个问题:在程序中有一个文件名,需要生成并执行一个 shell 命令,比如通过 os.execute 执行。但这个文件名可能包含特殊字符。
比如,如果文件名是:这个文件名不能直接在 shell 命令中使用
[SumiSora&CASO&HKG][Tears_to_Tiara][02][GB].rmvb
那么转义之后就是:
\[SumiSora\&CASO\&HKG\]\[Tears_to_Tiara\]\[02\]\[GB\].rmvb
或者采用单引号的办法:
'[SumiSora&CASO&HKG][Tears_to_Tiara][02][GB].rmvb'
经过一些搜索:
http://stackoverflow.com/questions/35817/how-to-escape-os-system-calls-in-python
http://stackoverflow.com/questions/5608112/escape-filenames-using-the-same-way-bash-do-it
我找到了 bash 的内置命令 printf "%q" str 可以实现这个功能,于是下载了 bash 的源代码来看。首先定位到 builtins/printf.def 文件,其中 q 的部分调用了以下函数:
ansic_shouldquote
ansic_quote
sh_backslash_quote
前两个函数在 lib/sh/strtrans.c 中,后一个函数在 lib/sh/shquote.c 中。所以最后终于定位到 shquote.c 这个文件。
1. 如果要使用单引号转义,那么使用 sh_single_quote 的算法
2. 想用反斜线转义,使用 sh_blackslash_quote 的算法
## 实现
出于方便考虑,我只实现了单引号转义,下面是一个 lua 的实现
- function shquote(s)
- return "."..string.gsub("'", "'\''").."'"
- end
- 为 bash 转义文件名
- 为 bash 转义文件名
- 为 bash 转义文件名
- bash中的转义
- bash中的转义字符
- git status输出, 中文文件名显示为转义字符编码(乱码)
- python bash escape(转义)
- Bash引用变量和转义
- Shell(Bash) - 文件名.字符串截取
- Mac Bash find 文件名 替换
- bash下处理包含空格的文件名
- opensuse12.2 bash文件名显示不全解决方法~
- bash特性之文件名通配(globbing)
- 利用bash shell批量修改文件名
- Bash循环处理带有空格的文件名
- log4Net 以日期为文件名
- log4Net 以日期为文件名
- 转义字符引发的血案(hive、bash)
- bash 的內建命令「printf」小結
- Two ways of using Iterator
- 非阻塞式socket编程(select() )
- hdu 2045(简单递推)
- 小玩Spring3.X的SpEL表达式
- 为 bash 转义文件名
- 积极心理学名人名言
- DataSnap客户端共享服务器端的数据库连接
- Java出现No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing
- 我们的未来在哪里
- 使用System.arraycopy()实现数组之间的复制
- [转]DataSnap服务器方法返回TClientDataSet的简易实现
- 计算机经典书籍电子书合集(适合计算机学生学习以及程序员笔试、面试)
- 中国版XBee模块,同样支持arduino,完全兼容XBee