【问题标题】:How can I deal with pathnames that include problematic (= shell meta and space) characters?如何处理包含有问题(= shell 元和空格)字符的路径名?
【发布时间】:2011-08-26 09:27:54
【问题描述】:

我经常有一些名字很奇怪的文件,比如/foo/bar * baka/waka xoxotinh(|).mp3。为了正确引用文件,用任意语言转义这个东西的正确方法是什么?

【问题讨论】:

  • 我可以建议将 bash 重新标记为 sh 因为这适用于所有 Bourne 类型的 shell?当您使用它时,从 linuxunix,因为它适用于独立于 Unix 风格的 shell?

标签: linux bash escaping


【解决方案1】:

使用\转义每个保留字符:

/foo/bar\ \*\ baka/waka\ \*\ xoxotinh\(\|\).mp3

或者像这样用引号括起来:

"/foo/bar * baka/waka * xoxotinh(|).mp3"

【讨论】:

    【解决方案2】:

    您可以通过在'' 中包含整个路径或通过\ 转义单个“怪异”字符来转义它。

    这并不总是一件容易的事,所以如果您在 bash 提示符下直接执行此操作,那么只需使用 TAB 完成路径 - bash 会为您转义“奇怪”字符。

    下面是 bash 如何逃脱它:

    cd /foo/bar\ \*\ baka/waka\ xoxotinh\(\|\).mp3/
    

    注意:我通过以下方式创建了路径:

    mkdir -p '/foo/bar * baka/waka xoxotinh(|).mp3'
    

    【讨论】:

      【解决方案3】:

      在任意语言中,它完全取决于该语言及其引用约定。在我熟悉的大多数语言中,您的示例文件名并不是特别有问题,除了在 shell 脚本中;在 sh 和衍生物中,使用单引号来表示这类事情。

      【讨论】:

        【解决方案4】:

        您需要在"asd * sdd||ss.mp3" 等引号之间添加文件名,或转义字符。转义意味着您需要在每个无效字符前添加\

        例如,在 php 中你有 http://www.php.net/manual/en/function.escapeshellarg.php

        【讨论】:

          【解决方案5】:

          在 BASH 中,您可以使用双引号去除 *? 的通配含义。反引号有点麻烦。你必须把它们加倍。

          事实上,您可以在 Bash 中的任何非字母数字字符前面简单地添加一个反斜杠tick,并且非常安全。这在 Linux 上的 Bash 中运行得非常好:

          newFileName=$(echo -E "$fileName" | sed 's/[^[:alnum:]]/\\/g')
          

          【讨论】:

          • 当你说反引号 (`) 时,我认为你的意思是反斜杠 (\)。
          【解决方案6】:

          除了用反斜杠引用每个shell 元字符 和空格外,没有通用 解决方案。如果您使用“单引号”进行引用,则名称中包含单引号会出现问题。如果您使用“双引号”引用,则名称中包含双引号和美元符号会出现问题。当然也有包含两者的名称...但是您可以使用不同的引用样式引用部分名称:

          ls "name with spaces & a single quote->'"' and name with "quotes" and $'
          

          注意第二个双引号如何结束第一部分,下一个字符是引用其余部分的单引号。那里!引用了一个包含两个引号的名称!一旦 shell 执行了 引号删除(总是最后),ls 将会看到

          name with spaces & a single quote->' and name with "quotes" and $
          

          作为单个参数。

          【讨论】:

            猜你喜欢
            • 2011-12-22
            • 1970-01-01
            • 1970-01-01
            • 2013-03-08
            • 2011-03-26
            • 2015-05-13
            • 2010-09-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多