什么是可能需要转义的linux路径字符

时间:2010-11-05 03:18:31

标签: java regex linux scala

我想知道什么是所有需要逃避Linux路径的char。例如,路径/ home / user1 / My Music / song 1.mp3需要在shell中为ls命令'ls / home / user1 / My \ Music / song \ 1.mp3'进行转义。

我想编写一个函数,它将String作为路径并转义所有需要的字符。在斯卡拉我有:

  def normalizePath(path: String): String = {
var normPath = path.replaceAll(" ", "\\\\ ")
normPath = normPath.replaceAll("\\]", "\\\\]")
normPath = normPath.replaceAll("\\[", "\\\\[")

normPath

}

知道有更多的char需要转义。此外,这可能可以通过一个命令(更复杂的正则表达式)来完成?

3 个答案:

答案 0 :(得分:7)

你不应该继续这样做。有很多方法可以解决这个问题(例如设置FS环境变量)。只需使用ProcessBuilder类来传递命令行参数。

ProcessBuilder proc = new ProcessBuilder("ls", "/home/user1/My Music/song 1.mp3");
proc.start();

答案 1 :(得分:2)

我认为引用字符串比逃避字符串更简单。单引号的算法是:

  • 附加单引号char以打开
  • 表示原始字符串中的每个字符,
    • 如果是单引号,请附加单引号,反斜杠,单引号,单引号(即关闭报价,附加转义单引号,重新开启报价)
    • 另外附加char本身
  • 附加单引号字符以关闭

所以这很容易。

但是,我喜欢ProcessBuilder的答案,如果它适合你,那就更容易了。

如果你不需要任何shell功能并且只想产生一个进程,那么完全避免shell既可以获得性能也可以获得安全性。

如果您确实想要使用转义,我建议使用白名单而不是将字符列入黑名单。即逃避任何不是[a-zA-Z0-9_]或其他东西的东西。除换行符外,任何字符都可以转义。反斜杠后跟换行意味着“删除反斜杠和换行符” - 如果不在引号之外。在双引号内,我认为你可以使用反斜杠转换换行符然后换行。在单引号内,我不认为你必须(或可以)转义换行符,只需附加换行符。

一个很好的参考是“Shell命令语言”http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html

的UNIX98规范

答案 2 :(得分:0)

单引号可防止shell扩展,因此您只需:

def normalizePath(path: String): String = "'" + path.replace("'", "\\'") + "'"