【问题标题】:How to cd into a directory with space in the name?如何 cd 进入名称中带有空格的目录?
【发布时间】:2013-08-21 19:44:59
【问题描述】:

我正在尝试进入目录/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

【问题讨论】:

  • 不要转义空格,但要加上引号:DOCS="/cygdrive/c/Users/my dir/Documents"
  • 没有区别。我在上面进行了编辑,因此空间中没有逃脱。
  • 如果我使用反斜杠或引号转义空格并没有真正的区别,但我还是再次这样做了。见修订。
  • 当你想cd时,使用cd "$DOCS"
  • 我不想使用引号。我很懒,呵呵。虽然我会说它确实有效。

标签: bash cygwin cd


【解决方案1】:

代替:

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

试试:

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

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

【讨论】:

  • 我应该加入,我正在使用 Cygwin。不应该有所作为,但我试过了,但没有奏效。
  • ls /cygdrive/c/Users 显示了什么? Cygwin 看到的任何目录都应该用作 BASH 变量。
    Cygwin 在 windows-unicey 文件翻译方面往往不够完美。如果您不移植软件,并且不需要 POSIX 合规性,那么 MinGW/MSYS 比 Cygwin 快 10-100%,而且更不容易出错:mingw.org/wiki/msys
  • 您也可以尝试在 Windows 用户或系统设置中设置 DOCS 变量,因为它们是默认导入的。系统-> 高级-> 环境变量 Cygwin 在空格、区分大小写和其他方面令人难以置信的“夸夸其谈”,通常需要额外的配置才能以 Unicey 方式运行。
  • 这也可以在运行时通过编辑 startcyg.bat 并添加 set DOCS="/cygdrive/c/Users/my\ dir/Documents" 来设置
【解决方案2】:
$ cd "$DOCS"

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

注意$HOME 也会有同样的问题。问题出在外壳评估变量引用时;这与您使用的变量或分配给它们的方式无关。需要引用的是展开式。

$ 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 抱歉。你必须这样做。
  • 嗯... $HOME 是怎么做到的?
  • -_-。我可以安全地执行 cd $HOME 但不能执行 cd $DOCS...?
  • 哦..什么...我可以发誓我可以做 cd $HOME,但是...嗯。好的,有没有办法在变量中包含 " ?我现在试试。
【解决方案3】:

试试

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

cd "$DOCS"

【讨论】:

  • 试过了吗?这会将一个实际的反斜杠字符放入"$DOCS"
【解决方案4】:

为什么不在你的.cshrc(或.bashrc,或任何你的默认shell)中加入以下内容:

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

第一次这样做,你必须这样做

source .cshrc

要用这个新别名更新 shell,然后你可以输入

mydoc

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

懒惰是发明之母......

【讨论】:

  • 我想他们是这么说战争的……我会试试的。必须安装别名(cygwin)。
  • 呃,需要新的 setup.exe。还有 2 秒。
  • 有效!但是现在我很生气,因为 cd $DOCS 对于所有目的都应该起作用...您能解释一下为什么手动输入时变量不起作用(变量应该扩展到什么)吗?如果有什么能胜过我的懒惰,那就是好奇心。
  • 我看到@JohnKugelman 已经回答了你的另一个问题......“它不能完成”;我认为这意味着我的方法是实现您真正想要的最有希望的方法 - 以最少的输入(并且不使用引号)更改到此目录。
  • 这为您提供了一种将cd 放入目录的方法,但不能对其进行任何其他操作。如果$DOCS 定义正确,您可以执行ls -l "$DOCS" 之类的操作。
【解决方案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 中的 any 变量引用是个好主意,除非您确定该值没有任何有趣的字符):

$ cd "$DOCS"

您也可以考虑为该目录命名,其中不包含任何空格——尽管这在 Windows 上通常很难做到。

【讨论】:

    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

      好吧,我也花了一些令人沮丧的时间来解决这个问题。我的小向导。

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

      cd 桌面

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

      cd,制作1个空格键,然后按tab 2次

      现在,如果您想使用 SPACE IN NAME 输入目录/文件。让我们打开一些文件名 f.g.,打开它我们需要输入:

      cd 文件\名称

      附言注意斜线后面的这个空格:)

      【讨论】:

        【解决方案8】:

        解决方案:

        cd "Documents and Photos"
        

        问题解决了。

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

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

        【讨论】:

          【解决方案9】:

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

          C:\> cd my folder
          

          将会

           C:\> cd my\ folder 
          

          【讨论】:

            【解决方案10】:

            方法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

            【讨论】:

              【解决方案11】:

              Cygwin 无法识别 PC 名称之间的空格。所以要解决这个问题,你必须在第一个单词后使用“\”,然后包含空格,然后是姓氏。

              如“.../my\dir/”

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

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

              例如 运行如下:

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

              希望它有效吗?

              【讨论】:

                【解决方案12】:

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

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

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

                cd docs
                

                shell 会指出它切换到了哪个目录:

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

                【讨论】:

                  【解决方案13】:

                  要切换到名称中包含空格的目录,您只需输入如下内容:

                  cd My\ Documents

                  点击进入,你会很好

                  【讨论】:

                    【解决方案14】:

                    使用引号! cd "Name of Directory"
                    或者你可以去文件资源管理器点击左上角的“复制路径”!

                    【讨论】:

                      【解决方案15】:

                      此处讨论的方法不适用于一致的别名 - 添加/不添加引号等。

                      例如如果我有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'
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2012-08-15
                        • 2016-07-22
                        • 2015-06-03
                        • 2019-04-02
                        • 2016-02-27
                        • 2010-10-10
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多