如何删除名称为“--”的目录(单引号是名称的一部分)

如何删除名称为“--”的目录(单引号是名称的一部分)

一个写得不好的脚本'--'在我的主目录中创建了一个名为(包括单引号)的目录。

当我cd进入该目录时,我将返回到我的主目录。

我想删除该项目,但不知道该怎么做。转义目录名称中的部分或全部字符,返回No such file or directory

Linux版本

Linux version 5.11.0-1022-aws (buildd@lgw01-amd64-036) (gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #23~20.04.1-Ubuntu SMP Mon Nov 15 14:03:19 UTC 2021

答案1

就您而言,由于您实际上将引号作为名称的一部分,因此您可以执行以下操作:

rm -r \'--\'

或者

rmdir \'--\'

更常见的情况是引号不是名称的一部分,因此您还需要处理名称看起来像一个选项(以 开头-)这一事实。在这种情况下,经典的方法是:

  1. 用于--表示选项的结束,以便 后面的任何内容--都不会被解析为选项,即使它以 开头-

     rmdir -- "'--'"
    
  2. 使用完整路径或仅使用./(但您还需要引用名称以保护'免受 shell 的影响):

     rmdir ./"'--'"
    
  3. 使用 GNU find

     find . -name "'--'" -delete
    
  4. 使用其他东西。像 Perl 一样:

     perl -e "rmdir(\"'--'\")"
    

请注意,以上所有内容均假设该目录为空。如果不是,只需使用其中之一即可:

rm -r ./"'--'"

或者

rm -r -- "'--'"

答案2

对于带有引号、反斜杠、空格、换行符等的“有趣”名称,如其他答案所示,需要引用和/或转义。

但是,如果您尝试从终端以交互方式使用文件名(而不是脚本),制表符补全对于为您进行引用确实很有帮助。

使用您拥有的目录名称,只需键入:

rm -r \'<tab>

Tab 键在哪里,位于键盘上<tab>字母的左侧。Q我们使用\'转义第一个单引号字符,因为它是一个特殊字符。

如果没有任何其他以单引号字符开头的文件/目录,bash 将完成文件名,并正确转义:

rm -r \'--\'/

注意:似乎不需要--按照其他答案的建议添加“选项结束”序列,因为文件名的第一个字母不是-减号字符。

答案3

$ mkdir -- \'--\'
$ ls
'--'
$ rmdir -- \'--\'
$ ls
$

答案4

GNU coreutils 版本ls(您可能会在 Linux 上看到)有一个--quoting-style选项,它控制如何显示带有不可打印或其他有趣字符的名称。如果设置为shell-escape,它将使用各种 shell 引号来使输出更具可读性和作为 shell 的输入有效。该输出可以作为 的参数复制粘贴到 shell 命令行rm

但请注意,它使用$'...'引号使特殊字符更具可读性,虽然现在大多数 shell 都支持它,但并非所有 shell 都可以。特别是,Debian 和 Ubuntu 上使用的 shell Dash/bin/sh似乎不支持它。不过,Bash、ksh 和 zsh 肯定可以。

在这里,第二个文件是你的'--',用双引号引起来,另一个文件是令人厌恶的,包含 Ctrl-A、制表符、换行符、单引号和尾随空格等字符。在那里它使用$'..'反斜杠转义。

$ ls --quoting-style=shell-escape -1
''$'\001\t'\''foo'$'\n''bar '
"'--'"

ls似乎并没有尝试最大限度地减少输出,第一个可以打印为只是$'\001\t\'foo\nbar '

可以使用该输出删除其中一个或两个:

$ rm -- ''$'\001\t'\''foo'$'\n''bar '
$ rm -- "'--'"

--请注意,如果文件名以破折号开头,您仍然需要使用,即使ls显示该破折号被引用。

我认为shell-escape这也是最近版本使用的默认引用样式ls(至少输出看起来像它),所以你实际上不需要拼写出长选项。

相关内容