为 bash 转义文件名
来源:互联网 发布:mono是什么软件 编辑:程序博客网 时间:2024/06/05 18:33
最近遇到的一个问题:程序中有一个文件名,需要把这个文件名放在 shell 中执行,但文件名中可能包含特殊字符,所以需要转义。
比如,如果文件名是:
[SumiSora&CASO&HKG][Tears_to_Tiara][02][GB].rmvb
这个文件名肯定不能直接放到 bash 中的,因为“&”和 [ 、] 等都是 bash 的特殊字符。
bash 的自动补全默认采用反斜线转义:
\[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
找到了两个东西可以实现这个功能:
- python 3.3a 的 shlex.quote
- bash 的内置命令 printf "%q" str(这货可不是 coreutils 的 printf !)
但既然要实现 bash 的文件名转义,没有什么比 bash 本身的代码更权威的了。于是下载了 bash-4.2 的源代码来看。先花了很多时间定位,最终定位到 builtins/printf.def 这个文件,在大约 500 多行 case 'q' 的部分调用了以下函数:
- ansic_shouldquote
- ansic_quote
- sh_backslash_quote
前两个函数在 lib/sh/strtrans.c 中,后一个函数在 lib/sh/shquote.c 中。所以最后终于定位到 shquote.c 这个文件。
- 如果要使用单引号转义,那么使用 sh_single_quote 的算法
- 想用反斜线转义,那么使用 sh_blackslash_quote 的算法
这两个函数的代码如下:
单引号转义:
反斜线转义:
转自:http://blog.henix.info/blog/escape-quote-filename-bash.html
- 为 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)
- TUXEDO与WEBLOGIC通过WTC进行互连的配置
- arx选择集实例
- matlab 7与vc/mfc混合编程 脱离运行环境,移植代码
- Multimedia Programming Guide--多媒体编程指南
- servlet跳转页面的几种方法
- 为 bash 转义文件名
- 2013年4月_武科大程序设计大赛(复赛)_解题报告(problem 1004)
- 随机码容量计算
- CompactPCI
- virtualBox使用复制的VDI出现UUID重复的错误(解决方法)
- J2EE开发常用框架介绍
- 《Inter汇编语言程序设计》8.6 创建多模块程序(INVOKE PROTO)
- git 命令之git rebase 用法
- ACE 6.1.3 发布,面向对象的工具开发包