无法使用 cygwin shell 删除文件

无法使用 cygwin shell 删除文件

我正在尝试从 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'

波浪号扩展

如果单词以未加引号的波浪号开头~,则所有字符直到第一个未加引号的斜杠(如果没有未加引号的斜杠,则为所有字符)都被视为波浪号前缀。如果波浪号前缀中的任何字符都没有加引号,则波浪号后面的波浪号前缀中的字符将被视为可能的登录名。如果此登录名为空字符串,则波浪号将替换为HOMEshell 变量的值。如果HOME未设置,则将替换为执行 shell 的用户的主目录。否则,波浪号前缀将替换为与指定登录名关联的主目录。

来源外壳扩展


Shell 参数扩展

字符$引入参数扩展、命令替换或算术扩展。要扩展的参数名称或符号可以用括号括起来,括号是可选的,但可以保护要扩展的变量免受紧随其后的字符的影响,因为这些字符可能会被解释为名称的一部分。

来源外壳扩展


引用

引号用于删除某些字符或单词对 shell 的特殊含义。引号可用于禁用对特殊字符的特殊处理、防止保留字被识别为保留字以及防止参数扩展。

每个 shell 元字符对于 shell 来说都有特殊的含义,如果要表示自己,就必须用引号引起来。

转义符

未加引号的反斜杠\是 Bash 转义字符。它保留其后下一个字符的字面值,但换行符除外。如果出现 \newline 对,并且反斜杠本身未加引号,则 \newline 会被视为行延续(即,它会从输入流中删除并被有效忽略)。

单引号

将字符括在单引号中'可保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠。

双引号

将字符括在双引号中会保留引号内所有字符的字面值,但、` 和 "除外。字符和 ` 在双引号内保留其特殊含义。反斜杠仅后跟下列字符之一时才保留其特殊含义:、`、、或换行符。在双引号中,后跟这些字符之一的反斜杠将被删除。位于没有特殊含义的字符之前的反斜杠保持不变。可以在双引号内引用双引号,只需在双引号前面加上反斜杠即可。$\$$"\

来源引用


进一步阅读

答案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 {} \;

如果可以在名称部分找到匹配的模式,这是处理包含特殊字符的文件的最简单方法。

相关内容