当前位置: 首页 > 知识库问答 >
问题:

如何cd到名称中有空格的目录?

山阳辉
2023-03-14

我正试图进入目录/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个答案

白子昂
2023-03-14
$ DOCS="/cygdrive/c/Users/my\ dir/Documents"

这是你的第一个问题。这会将一个实际的反斜杠字符放入$DOCS,运行此命令可以看到:

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

定义文档时,确实需要转义空格字符。可以引用字符串(使用单引号或双引号),也可以用反斜杠转义空格字符。你不能两者都做。(在大多数类似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设置为文档目录的名称,请执行以下任一操作:

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

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

$ cd "$DOCS"

您还可以考虑给该目录起一个没有空格的名称——尽管在Windows上通常很难做到这一点。

山鸿彩
2023-03-14

解决方案:

cd "Documents and Photos"

问题解决了。

我提交这个答案的原因是您会发现StackOverflow被日常用户(不仅仅是Web开发人员、程序员或高级用户)使用,这是Google上一个简单的Windows用户问题的第一个结果。

人们越来越精通技术,但在上述情况下不一定熟悉命令行。

陆飞鸿
2023-03-14
$ 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"'

两个参数,双引号完好无损。

 类似资料:
  • 我现在正在尝试将整个目录从一个集群镜像复制到另一个集群。但是当名称中有一个空格时,它失败了,我不知道如何解决这个问题,因为scp似乎认为我在复制多个文件。我正在使用一个变量来标记我需要的路径,所以添加反斜杠似乎不容易解决。 这是我正在使用的代码: 我试过单引号、双引号和单引号加双引号,都不行。有人能帮我解决吗?顺便说一下,代码中的mkdir语句是有效的。

  • 文件路径类似于C:\test\NPP\223083-A\u BELI Frenchips Poulet roti face。eps 该命令适用于文件名中没有空格但带有空格的文件,它给出的错误如下: {转换:无法打开图像'C:\test\NPP\223083-A_BELI':没有这样的文件或目录@error/blob. c/OpenBlob/3094.convert:没有此图像格式的解码委托'@er

  • 问题内容: 我数据库中的列名称之一是两个字长,包括一个空格,即:。我正在使用SELECT并引用列名称来提取所需的数据。现在,如果我将该列命名,则我的SELECT可以工作,但如果使用,则不能。它说 “字段列表”中的“未知”列“区域” 有想法吗? 问题答案: 使用反引号。

  • 问题内容: 我有一个来自遗留系统的悖论表,我需要对其进行单个查询。字段名称中包含空格-即“街道1”。当我尝试在delphi中仅对“街道1”字段制定查询时,出现错误- 关键字使用无效。令牌:1,行号:1 Delphi V7-对象Pascal,标准Tquery对象名称query1。 问题答案: 您需要在查询中为字符串加上表名的前缀。 例如:字段名称为“ Street 1”,表称为客户,选择为:

  • 问题内容: 运行将返回“ Clear Workspace = true”。如何在bash中访问它?仅供参考,它来自Jenkins Parameterized Build参数名称。似乎不起作用。 而且,詹金斯怎么能创建这个环境变量?在bash中运行显然不起作用,因为它尝试使用参数“ Workspace = true”运行“ Clear”命令。 我当然可以将作业参数名称设置为Clear_Workspa

  • 问题内容: 我 是否 必须删除文件名中的所有空格才能将其导入,或者是否可以通过某种方式知道是否存在空格? 问题答案: 您应该从文件名中删除空格。由于文件名被用作导入模块的标识符(即将被导入为),而Python标识符不能有空格,因此该语句不支持此操作。 如果由于某些原因 确实 需要执行此操作,可以使用以下函数: 这将导入为。这与该语句的行为略有不同,应避免使用它。