一个写得不好的脚本'--'
在我的主目录中创建了一个名为(包括单引号)的目录。
当我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 \'--\'
更常见的情况是引号不是名称的一部分,因此您还需要处理名称看起来像一个选项(以 开头-
)这一事实。在这种情况下,经典的方法是:
用于
--
表示选项的结束,以便 后面的任何内容--
都不会被解析为选项,即使它以 开头-
:rmdir -- "'--'"
使用完整路径或仅使用
./
(但您还需要引用名称以保护'
免受 shell 的影响):rmdir ./"'--'"
使用 GNU
find
:find . -name "'--'" -delete
使用其他东西。像 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
(至少输出看起来像它),所以你实际上不需要拼写出长选项。