以与 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功能?

如何以与在 Windows 资源管理器中“发送给邮件收件人”相同的方式以编程方式发送电子邮件?

Python/Bash - 获取带有转义字符的文件名

bash - 转义变量SSH命令而不改变它

以与文件相同的顺序加载图像

如何以与文件夹中相同的顺序附加带有 pdf 文件名、大小和描述的 helloworld.txt(按修改时间排序)?