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

我试图进入目录 /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
171081 次浏览

而不是:

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

试试:

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

这应该适用于任何 POSIX系统。

$ 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 '"/cygdrive/c/Users/my' 'dir/Documents"'

两个参数,双引号完整。

试试看

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


cd "$DOCS"

为什么不在你的 .cshrc(或者 .bashrc,或者不管你的默认 shell 是什么)中放入以下内容呢:

alias mydoc 'cd "/cygdrive/c/Users/my dir/Documents"'

你第一次这么做的时候,你必须这么做

source .cshrc

用这个新别名更新 shell,然后可以键入

mydoc

任何时候你想 cd到你的目录。

懒惰是发明之母。

$ 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/Documentscd碰巧悄悄地忽略了除了第一个参数以外的所有参数,这解释了错误消息:

-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 上通常很难做到这一点。

如果你想从 c:\移动到 c:\Documents and settings,在控制台上写: c:\Documents\[space]+tab和 cygwin 将自动完成它作为 c:\Documents\ and\ settings/

好吧,我也花了一些时间在这个问题上。我的小向导。

例如,打开桌面。如果没有在 cmd 中切换光盘,请键入:

光盘桌面

现在,如果您想显示子文件夹:

Cd ,制作1个 空格键,按 标签2次

现在,如果您想使用 名称中的空格输入目录/文件。让我们打开一些 文件名 fg,要打开它,我们需要输入:

Cd 文件名

注意斜杠后面的空格:)

解决方案:

cd "Documents and Photos"

问题解决了。

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

人们变得越来越精通技术,但是在上面的例子中并不一定熟悉命令行。

使用反斜杠符号(\)转义空格:

C:\> cd my folder

将会是

 C:\> cd my\ folder

方法1: 引用

cd "C:/Prgram Files (x86)"

cd 'C:/Program Files (x86)'

广义的

cd 'Folder Path'

方法2 : 不使用引号

cd Program\ Files \(x86\)

广义的 当我们想要跳过下一个字符时,我们使用黑斜杠 \

对于上述问题: cd /cygdrive/c/Users/my\ dir/Documents

Cygwin 在个人电脑名称之间有识别空间的问题。所以要解决这个问题,你必须在第一个单词后面加上“”,然后加上空格,最后加上姓。

比如“ .../我的导演/”

$ cd /cygdrive/c/Users/my\ dir/Documents

另一个有趣而简单的方法是将目录放在引号(“”)中

运行如下:

$ cd c:
$ cd Users
$ cd "my dir"
$ cd Documents

希望有用?

作为使用引号的替代方法,对于您想要经常访问的目录,您可以使用 cdable_vars shell 选项:

shopt -s cdable_vars
docs='/cygdrive/c/Users/my dir/Documents'

现在,要从任何地方切换到该目录,可以使用

cd docs

Shell 将指示它更改到了哪个目录:

$ cd docs
/cygdrive/c/Users/my dir/Documents

要切换到名称上有空格的目录,您只需像下面这样键入:

cd My\ Documents

进来,你就没事了

用引号! cd "Name of Directory"
或者你可以进入文件浏览器,点击左上角的“复制路径”!

这里讨论的方法不适用于一致的别名——添加/不添加引号等等。

例如,如果我有一个像 dir_with_spaces='path of the directory with spaces'这样的目录变量,就不可能直接使用 alias new_dir='cd $dir_with_spaces/subdirectory'.

作为替代方案,创建一个在 cd 周围添加引号的自定义函数,然后使用这个自定义函数将非常有用。

cdwq() # Custom cd to support directories with spaces in the name by adding quotes around it
{
local folder_path=$1
cd "${folder_path}"
}

现在,可以对任何目录变量使用这个自定义函数。

dir_with_spaces='path of the directory with spaces'
dir_without_spaces='path_of_the_directory_without_spaces'


alias new_dir1='cdwq $dir_with_spaces/subdirectory1'
alias new_dir2='cdwq $dir_with_spaces/subdirectory2'
alias new_dir3='cdwq $dir_without_spaces/subdirectory3'
alias new_dir4='cdwq $dir_without_spaces/subdirectory4'
alias new_dir5='cdwq $dir_with_spaces/subdirectory5'

如果目录名称中有空格,可以使用通配符(?*)代替空格并将目录名称用双引号括起来。

示例-在下面的路径中,“ Program Files”中有空格-

/mnt/c/Program Files$ JAVA_HOME=/mnt/c/"Program?Files"/Java/jdk-11.0.12


/mnt/c/Program Files$ cd $JAVA_HOME


/mnt/c/Program Files/Java/jdk-11.0.12$

如果您想要 CD 到一个路径,其中包含空格的目录位于两者之间。您可以将整个路径包装为引号。

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

只要在包含空格的文件周围使用引号即可

cd "file with space"