如何进入名字中有空格的目录?

79

我试图进入目录/cygdrive/c/Users/my dir/Documents

$ DOCS="/cygdrive/c/Users/my\ dir/Documents"

$ echo $DOCS
/cygdrive/c/Users/my\ dir/Documents

$ cd $DOCS
-bash: cd: /cygdrive/c/Users/my\: No such file or directory

$ cd /cygdrive/c/Users/my\ dir/Documents
(success)

手动输入时,退格键会执行转义字符操作,但是在使用变量DOCS的参数扩展时不会。

我尝试了其他变量,比如没有反斜杠。

$ DOCS=/cygdrive/c/Users\ dir/Documents

$ echo $DOCS
/cygdrive/c/Users/my dir/Documents

$ cd $DOCS
-bash: cd: /cygdrive/c/Users/my: No such file or directory
$ DOCS="/cygdrive/c/Users/my dir/Documents"

$ echo $DOCS
/cygdrive/c/Users/my dir/Documents

$ cd $DOCS
-bash: cd: /cygdrive/c/Users/my: No such file or directory
同样的情况也会发生在$HOME中:
$ echo $HOME
/home/my dir

cd $HOME 也不起作用。必须在它周围加上引号。

到底是怎么回事:

$ DOCS="\"/cygdrive/c/Users/my dir/Documents\""

$ echo $DOCS
"/cygdrive/c/Users/my dir/Documents"

$ cd $DOCS
-bash: cd: "/cygdrive/c/Users/my: No such file or directory

3
不要去掉空格,但请加上引号:DOCS="/cygdrive/c/Users/my dir/Documents" - Floris
没有真正的区别,无论我是使用反斜杠还是引号来转义空格,但我还是这样做了。请查看修订版。 - user2316667
1
当你想要使用 cd 命令时,请使用 cd "$DOCS" - Floris
我不想使用引号。我有点懒,呵呵。虽然我要说它确实有效。 - user2316667
如果你真的那么懒,那么你就没什么好运了。 - Floris
显示剩余10条评论
18个回答

75
$ cd "$DOCS"

为防止空格被解析为单词分隔符,您需要引用"$DOCS"。通常情况下,变量引用应该加上引号。

请注意,$HOME也会有同样的问题。这个问题是由shell评估变量引用时引起的;与您使用哪些变量或如何分配给它们无关。需要引用扩展内容。

$ echo $HOME
/home/my dir

这是有欺骗性的。 echo 实际上正在回显两个字符串 /home/mydir。如果您使用cdls,您将看到它实际上是如何工作的。

$ ls $HOME
ls: cannot access /home/my: No such file or directory
ls: cannot access dir: No such file or directory
$ cd $HOME
bash: cd: /home/my: No such file or directory
$ cd "$HOME"
<success!>

为什么手动输入时它能正常工作,但是在变量中就不能工作呢?

好问题!让我们来看一下你键入的命令:

$ DOCS="\"/cygdrive/c/Users/my dir/Documents\""
$ echo $DOCS
"/cygdrive/c/Users/my dir/Documents"
$ cd $DOCS
-bash: cd: "/cygdrive/c/Users/my: No such file or directory

这个不起作用的原因是因为Bash在变量扩展内部不解析引号。它会执行单词拆分,所以未被引号包含的变量扩展中的空格被视为单词分隔符。它不会以任何方式解析引号,这意味着你不能将双引号放入变量中以覆盖单词拆分。

$ cd $DOCS

因此,cd 接收两个参数。就 cd 所知道的而言,这看起来像是你写的:

$ cd '"/cygdrive/c/Users/my' 'dir/Documents"'

两个参数,带有双引号。


我不想每次都使用引号。这就是为什么我最初插入反斜杠的原因。 - user2316667
1
@user2316667 抱歉,你必须这样做。 - John Kugelman
我可以安全地执行 cd $HOME,但不能执行 cd $DOCS...? - user2316667
我可以问一下为什么手动输入时它能够工作,但是在变量中却不能?另外请查看操作中的编辑。我在变量内部有双引号。尽管如此,问题仍然存在。有什么合理的解释吗? - user2316667
当您手动键入反斜杠时,shell 将其全部读取为一个单词,并 cd 到正确的位置,包括空格。当您将带有空格的名称保存在变量中时,shell 会在空格处分割 $DOCS,除非您用双引号将其括起来。即使您在变量值中包含一个或两个反斜杠,shell 也会在空格处分割该值。如果 $DOCS 包含反斜杠空格,则必须使用 eval cd $DOCS 才能使 cd 正常工作。从某种意义上说,这只是“它的工作方式”。这也是它“一直以来的工作方式”。 - Jonathan Leffler
显示剩余6条评论

53

解决方案:

cd "Documents and Photos"

问题已解决。

我提交这个答案的原因是你会发现StackOverflow被每天的用户(不仅仅是Web开发人员、程序员或高级用户)使用,并且这是谷歌上一个简单的Windows用户问题的排名第一结果。

人们正在变得更加熟练于技术,但在上述情况下可能并不熟悉命令行。


7
要更改带有空格名称的目录,您只需像这样键入: cd My\ Documents回车即可。

5
$ DOCS="/cygdrive/c/Users/my\ dir/Documents"

以下是您需要解决的第一个问题。这会将实际的反斜杠字符放入$DOCS中,您可以通过运行以下命令来查看:

$ echo "$DOCS"
/cygdrive/c/Users/my\ `

在定义 DOCS 时,您需要转义空格字符。您可以引用字符串(使用单引号或双引号)或者只能使用反斜杠来转义空格字符。两种方式都不能同时使用。(在大多数类Unix系统上,您可以在文件或目录名称中使用反斜杠,但这不是一个好主意。在Cygwin或Windows上, \ 是目录定界符。但我假设目录的实际名称是 my dir ,而不是 my \ dir 。)

$ cd $DOCS

这将两个参数传递给cd。第一个是cygdrive/c/Users/my\,第二个是dir/Documents。事实上,cd默默地忽略了除了它的第一个参数之外的所有参数,这解释了错误消息:

-bash: cd: /cygdrive/c/Users/my\: No such file or directory

要将$DOCS设置为您的Documents目录的名称,可以执行以下任何操作:

$ DOCS="/cygdrive/c/Users/my dir/Documents"
$ DOCS='/cygdrive/c/Users/my dir/Documents'
$ DOCS=/cygdrive/c/Users/my\ dir/Documents

完成后,要切换到您的Documents目录,请将变量引用括在双引号中(这对于bash中的任何变量引用都是一个好主意,除非您确定该值没有任何有趣的字符):

$ cd "$DOCS"

您也可以考虑给该目录命名时不要包含空格,尽管在Windows上通常很难做到。


4

使用引号! cd“目录名称”
或者你可以打开文件资源管理器,在左上角点击“复制路径”!


3

如果你想要进入一个路径,而该路径中间有一个带空格的目录。你可以将整个路径用引号括起来。

cd "C:\Users\JOE\Local Sites\skeleton"

2
Cygwin在识别PC名称中的空格时存在问题。因此,为了解决这个问题,您需要在第一个单词后面使用“\”,然后包括空格,再加上最后一个名称。例如:".../my\ dir/"。最初的回答保留html标签。
$ cd /cygdrive/c/Users/my\ dir/Documents

另一种有趣且简单的方法是将目录用引号括起来("")。
例如,按以下方式运行:
$ cd c:
$ cd Users
$ cd "my dir"
$ cd Documents

希望它有效吗?最初的回答。

1
如果你想从 c:\ 移动到 c:\Documents and settings,请在控制台中输入:c:\Documents\[space]+tab,cygwin 将自动补全为 c:\Documents\ and\ settings/

1

只需在文件名中包含空格时使用引号

cd "file with space"

这个答案已经被其他人给出了,比如Mindsect团队。 - ahuemmer

1
尝试
DOCS="/cygdrive/c/Users/my\ dir/Documents";

cd "$DOCS"

你试过吗?这会将一个实际的反斜杠字符放入"$DOCS"中。 - Keith Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接