【问题标题】:How do I deal with a filename that starts with the hyphen (-) character?如何处理以连字符 (-) 字符开头的文件名?
【发布时间】:2011-08-06 08:39:14
【问题描述】:

不知何故,在某些时候,我不小心在我的主目录中创建了一个名为“-s”的文件。它大约 500 kb,我不知道它是否包含重要数据。我想不出任何方法可以对这个文件进行任何操作,因为我用来尝试查看、复制或移动它的每个命令都将文件名解释为参数。

我试过把它放在引号里,用反斜杠转义,两者的结合,似乎没有任何效果。

另外,当我第一次向我的同事提出这个问题时,我们困惑了一段时间,直到有人终于无意中听到并问“你为什么不直接重命名它?”在我向他解释 cp 和 mv 都认为文件名是一个参数所以它不起作用之后,他说“不,不是从命令行,而是从 Gnome 执行。”我羞怯地听从了他的建议,而且奏效了。但是,如果您没有窗口管理器并且命令行是唯一的选择,我仍然对如何解决这个困境感兴趣。

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    您可以使用./-filename 来引用它,或者某些命令允许您将它放在双破折号之后:

    rm -- -filename
    

    【讨论】:

    • 当然!不敢相信我没有想到为文件名添加路径。现在我觉得更傻了:-)
    • @histumness: 这里也一样 :-)
    【解决方案2】:

    您可以通过以下方式摆脱它:

    rm ./-s
    

    rm 命令(至少在 Ubuntu 10.04 下)甚至会告诉您:

    pax@pax-desktop:~$ rm -w
    rm: invalid option -- 'w'
    Try `rm ./-w' to remove the file `-w'.
    Try `rm --help' for more information.
    

    之所以有效是因为rm 认为它不是一个选项(因为它不是以- 开头的),但它仍然指的是当前目录中的特定文件 .

    【讨论】:

      【解决方案3】:

      你可以使用--,例如:

      rm -- -file
      

      【讨论】:

      • 正确但不通用,不适用于非 gnu,甚至不适用于所有 gnu utils
      【解决方案4】:

      除了使用rm,如果你懂一种语言,你也可以使用它们。它们不受这种壳疣的影响。

      Ruby(1.9+)

      $ ruby -rfileutils -e 'FileUtils.rm("-s")'
      

      $ ruby -e 'File.unlink("-s")'
      

      【讨论】:

      • perl -e 'unlink "-s"'(因为 Perl 已经知道系统调用而无需加载任何内容)
      猜你喜欢
      • 2010-10-16
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多