以与 Bash 相同的方式转义文件名
Posted
技术标签:
【中文标题】以与 Bash 相同的方式转义文件名【英文标题】:Escape filenames the same way Bash does it 【发布时间】:2011-08-02 06:16:19 【问题描述】:当我在bash
中使用“tab”键时(当您开始输入文件名并希望它完成时),bash
会正确转义文件名,并且如果我完全使用该“转义”文件名,它可以工作。
例如:
An-Beat - Mentally Insine (Original Mix).mp3
=> 在bash
使用“TAB”转义它之后
An-Beat\ -\ Mentally\ Insine\ \(Original\ Mix\).mp3
我正在搜索bash
的函数,它可以像“tab”转义文件名一样转义文件名。
【问题讨论】:
mywiki.wooledge.org/XyProblem 感谢@Ignacio,我对这个问题的感受比我能说的要好得多。 :) @Ignacio 确实如此。这似乎与this question 有关,并且在变量值中获取引号根本无济于事——他需要它们围绕变量替换,以及一种循环值的方法,并且。 .. 【参考方案1】:$ string="An-Beat - Mentally Insine (Original Mix).mp3"
$ echo $string// /\\
An-Beat\ -\ Mentally\ Insine\ (Original\ Mix).mp3
$ string=$string// /\\
$ echo $string//(/\\(
An-Beat - Mentally Insine \( Original Mix).mp3
【讨论】:
【参考方案2】:使用printf
(1):
x='a real \good %* load of c$rap'
x=$(printf '%q' "$x")
echo $x
将返回
a\ real\ \\good\ %\*\ load\ of\ c\$rap
【讨论】:
如果x是shell脚本的参数,用户可以设置x包含('),我必须将(')替换为(\')。有什么简单的方法可以处理这种情况吗? @zsxwing 已经可以了,只需从x="'"
开始演示! (printf '%q" "'"
打印 \'
)
%q 在 Ubuntu 15.04 上的 printf 未知指令中
@airboss 呵呵。那就是“垃圾进垃圾出”。问题不是printf
,而是您传递给它的输入无效。只需使用printf '%q' 'test $2 3.jpeg'
,就像在任何需要未扩展字符串文字的地方一样使用 (man bash)
@airboss 另外,如果您只是使用给定的答案代码(而不是在不理解的情况下更改它):ideone.com/HdtYoJ【参考方案3】:
我将详细说明sehe对此的回应。
如果要将要转换的参数作为shell脚本参数传递,请将参数包含在“的”中。
#!/bin/bash
x=$(printf '%q' "$1")
echo $x
我真的很喜欢 printf 解决方案,因为它处理每个特殊字符,就像 bash。
【讨论】:
这是评论,不是详细说明,IMO【参考方案4】:"sehe" 的解决方案效果很好,此外,您还可以使用双引号 (") 而不是单撇号 (') 来使用变量:
x="a real \good %* load of crap from $USER"
echo $(printf '%q' "$x")
当然,字符串可能不包含 $ 或 " 本身,或者您必须通过启动 \$ 手动转义。
【讨论】:
【参考方案5】:ls --quoting-style=escape /somedir
这将输出转义的文件名,也适用于unicode字符,printf方法不适用于中文,它输出类似$'\206\305...'的东西
【讨论】:
【参考方案6】:我参加聚会可能有点晚了,但对我有用的是:
ls --quoting-style=shell-escape
这样它还可以转义!
或'
等字符。
【讨论】:
以上是关于以与 Bash 相同的方式转义文件名的主要内容,如果未能解决你的问题,请参考以下文章
如何在CentBS中以与CentOS相同的方式实现FreeBSD中的expr功能?