我正在尝试从 Cygwin shell 中的当前目录中删除该文件~$bgka.mod
。当我列出该目录中的所有文件时,它显示:
$ ls
~$bgka.mod CaBK.mod hcdist.hoc mcdist.hoc pbc.hoc
500net ccanl.mod hcell.bcell mcell.bcell pgc.hoc
50knet.hoc gcdist.hoc hcell.gcell mcell.gcell phc.hoc
bcdist.hoc gcell.bcell hcell.hcell mcell.hcell pmc.hoc
bcell.bcell gcell.gcell hcell.mcell mcell.mcell ppsyn.mod
bcell.gcell gcell.hcell hyperde3.mod mod_func.c README.html
bcell.hcell gcell.mcell ichan2.mod mosinit.hoc run50knet.bash
bcell.mcell Gfluct2.mod inhsyn.mod nca.mod screenshot.jpg
bgka.mod gskch.mod LcaMig.mod parameters.dat tca.mod
当我尝试时rm ~$bgka.mod
出现以下错误:
$ rm ~$bgka.mod
rm: cannot remove ‘~.mod’: No such file or directory
另外,我尝试从 Windows 资源管理器和 Windows 中删除该文件cmd.exe
,但它没有显示在这两个窗口中。
我怎样才能删除它?
答案1
我正在尝试从当前目录中删除文件 ~$bgka.mod
~
和$
是 bash 中的特殊字符。
您可以使用它们进行转义\
,或者将参数放在单引号中'
。
双引号不能用作“用双引号括起来的字符将保留引号内所有字符的字面值,但、` 和 \"
除外”$
使用:
rm \~\$bgka.mod
或者:
rm '~$bgka.mod'
波浪号扩展
如果单词以未加引号的波浪号开头
~
,则所有字符直到第一个未加引号的斜杠(如果没有未加引号的斜杠,则为所有字符)都被视为波浪号前缀。如果波浪号前缀中的任何字符都没有加引号,则波浪号后面的波浪号前缀中的字符将被视为可能的登录名。如果此登录名为空字符串,则波浪号将替换为HOME
shell 变量的值。如果HOME
未设置,则将替换为执行 shell 的用户的主目录。否则,波浪号前缀将替换为与指定登录名关联的主目录。
来源外壳扩展
Shell 参数扩展
字符
$
引入参数扩展、命令替换或算术扩展。要扩展的参数名称或符号可以用括号括起来,括号是可选的,但可以保护要扩展的变量免受紧随其后的字符的影响,因为这些字符可能会被解释为名称的一部分。
来源外壳扩展
引用
引号用于删除某些字符或单词对 shell 的特殊含义。引号可用于禁用对特殊字符的特殊处理、防止保留字被识别为保留字以及防止参数扩展。
每个 shell 元字符对于 shell 来说都有特殊的含义,如果要表示自己,就必须用引号引起来。
转义符
未加引号的反斜杠
\
是 Bash 转义字符。它保留其后下一个字符的字面值,但换行符除外。如果出现 \newline 对,并且反斜杠本身未加引号,则 \newline 会被视为行延续(即,它会从输入流中删除并被有效忽略)。单引号
将字符括在单引号中
'
可保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠。双引号
将字符括在双引号中会保留引号内所有字符的字面值,但、` 和
"
除外。字符和 ` 在双引号内保留其特殊含义。反斜杠仅后跟下列字符之一时才保留其特殊含义:、`、、或换行符。在双引号中,后跟这些字符之一的反斜杠将被删除。位于没有特殊含义的字符之前的反斜杠保持不变。可以在双引号内引用双引号,只需在双引号前面加上反斜杠即可。$
\
$
$
"
\
来源引用:
进一步阅读
- Linux 的 Bash 命令行的 AZ 索引- 与 Bash 命令行相关的所有事物的绝佳参考。
- ls- 列出有关文件的信息。
- 引用:
- shell 扩展
答案2
您需要引用文件名:
rm '~$bgka.mod'
讨论
如果没有引号,shell 会认为这$bgka
是一个 shell 变量,并替换其当前值。由于bgka
尚未分配任何内容,因此它会替换为空字符串。结果,shell 会尝试删除名为的文件~.mod
。该文件不存在。这就是您收到错误的原因:
rm: cannot remove ‘~.mod’: No such file or directory
将文件名括在单引号中可以解决这个问题,因为它告诉 shell 不要进行任何替换。
您可以使用一个简单的语句来查看单引号和无引号之间的区别echo
:
$ echo ~$bgka.mod '~$bgka.mod'
~.mod ~$bgka.mod
答案3
上面的答案非常详细和正确。处理包含特殊字符的文件名的一个有用技巧是“find”命令。
find -name "*bgka*" -exec rm {} \;
如果可以在名称部分找到匹配的模式,这是处理包含特殊字符的文件的最简单方法。