Como cd em um diretório com espaço no nome?
/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)
quando o digito manualmente, o backspace faz a sua coisa de carácter de escape, mas não quando uso a expansão do parâmetro com a variável DOCS
.
eu tentei outras variações como nenhuma barra invertida.
$ 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
ou
$ 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
O mesmo acontece com $HOME
:
$ echo $HOME
/home/my dir
cd $HOME
também não funciona. As citações devem ser postas à volta.
mas que raio:
$ 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
14 answers
$ cd "$DOCS"
Tem de citar "$DOCS"
para evitar que os espaços sejam processados como separadores de palavras. Na maioria das vezes, as referências variáveis devem ser citadas.
Note que $HOME
teria o mesmo problema. A questão vem de quando a shell avalia referências variáveis; não tem nada a ver com que variáveis você usa ou como você atribui a elas. É a expansão que precisa de ser citada.
$ echo $HOME
/home/my dir
Isto é enganador. echo
está a ecoar as duas cordas /home/my
e dir
. Se utilizar cd
ou ls
irá ver como funciona realmente.
$ 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!>
Posso perguntar porque funciona quando o digito manualmente, mas não numa variável?Grande pergunta! Vamos examinar os comandos que escreveu:
$ 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
A razão pela qual isto não funciona é porque o Bash não analisa citações dentro de Expansões variáveis. It does perform word splitting, so whitespace in unquoted variable expansions is taken as word separators. Ele não analisa aspas de forma alguma, o que significa que não pode colocar aspas duplas dentro de uma variável para substituir a divisão de palavras.
$ cd $DOCS
Por causa disto, passaram-se dois parâmetros. Tanto quanto cd
sabe, parece que escreveste:
$ cd '"/cygdrive/c/Users/my' 'dir/Documents"'
Dois parâmetros, com aspas intactas.
Solução:
cd "Documents and Photos"
Problema resolvido.
A razão pela qual estou a enviar esta resposta é que você vai descobrir que o StackOverflow está a ser usado por utilizadores de todos os dias (não apenas web devs, programadores ou utilizadores de energia) e este foi o resultado número um para uma simples pergunta do utilizador do Windows no Google.
As pessoas estão a ficar mais experientes em tecnologia, mas não estão necessariamente familiarizadas com a linha de comando nos casos acima.$ DOCS="/cygdrive/c/Users/my\ dir/Documents"
Eis o teu primeiro problema. Isto coloca um carácter de barra invertida real em $DOCS
, como poderá ver ao executar este comando:
$ echo "$DOCS"
/cygdrive/c/Users/my\ `
Ao definir DOCS
, você precisa de escapar do carácter do espaço. Você pode citar o texto (usando aspas simples ou duplas) ou você pode escapar apenas do carácter de espaço com uma barra invertida. Não podes fazer as duas coisas. (Na maioria dos sistemas Unix-like, você pode ter uma barra invertida em um arquivo ou nome de diretório, embora não seja uma boa idéia. No Cygwin ou Windows, \
é um separador de pastas. Mas vou assumir que o nome verdadeiro do Diretório é my dir
, não my\ dir
.)
$ cd $DOCS
Isto passa dois argumentos para cd
. O primeiro é cygdrive/c/Users/my\
, e o segundo é dir/Documents
. Acontece que cd
silenciosamente ignora tudo menos o seu primeiro argumento, o que explica a mensagem de erro:
-bash: cd: /cygdrive/c/Users/my\: No such file or directory
Para definir $DOCS
o nome do seu directório Documents
, faça qualquer um destes:
$ DOCS="/cygdrive/c/Users/my dir/Documents"
$ DOCS='/cygdrive/c/Users/my dir/Documents'
$ DOCS=/cygdrive/c/Users/my\ dir/Documents
Uma vez feito isso, para mudar para o seu ... directório, coloque a referência da variável entre aspas (é uma boa ideia para qualquer referência de variável na bash, a menos que tenha a certeza de que o valor não tem caracteres engraçados):
$ cd "$DOCS"
Você também pode considerar dar a esse diretório um nome sem quaisquer espaços nele -- embora isso possa ser difícil de fazer em geral no Windows.
Para mudar para uma pasta com espaços no nome, basta escrever assim:
cd My\ Documents
Carrega em entra e serás bom
Porque não colocar o seguinte no seu .cshrc
(ou .bashrc
, ou seja qual for a sua concha por omissão):
alias mydoc 'cd "/cygdrive/c/Users/my dir/Documents"'
A primeira vez que fazes isto, tens de fazer
source .cshrc
Para actualizar a linha de comandos com este novo nome, poderá então escrever
mydoc
Quando Quiser cd
para o seu directório.
Se quiser sair de c:\
e quiser ir para c:\Documents and settings
, escreva na consola: c:\Documents\[space]+tab
e o cygwin irá completá-lo automaticamente como c:\Documents\ and\ settings/
Tenta
DOCS="/cygdrive/c/Users/my\ dir/Documents";
cd "$DOCS"
Abrir o ecrã, por exemplo. Se não mudou o seu disco em cmd, escreva:
Ecrã de Cd
Agora se quiser mostrar as subpastas:
Cd , make 1 spacebar , and press tab 2 vezes
Agora se quiser indicar directório / ficheiro com espaço em nome. Vamos abrir algum Nome do ficheiro F. g., para o abrir precisamos de tipo:
Ficheiro de Cd\ Nome
P. S. repare neste espaço após barra:)
Método 1 : com aspas
cd "C:/Prgram Files (x86)"
cd 'C:/Program Files (x86)'
Geral
cd 'Folder Path'
Método 2 : sem usar aspas
cd Program\ Files \(x86\)
Generalizado Sempre que queremos saltar o próximo personagem, usamos blackslash
\
.
Para a pergunta acima:
cd /cygdrive/c/Users/my\ dir/Documents
A Cygwin tem problemas em reconhecer o espaço entre o nome do PC. Então, para resolver isso, você tem que usar "\" após a primeira palavra, em seguida, incluir o espaço, em seguida, o sobrenome.
Tal como".../my\ dir / "
$ cd /cygdrive/c/Users/my\ dir/Documents
Outra maneira interessante e simples de o fazer, é colocar o directório entre aspas ( "" )
E. g. execute-o da seguinte forma:
$ cd c:
$ cd Users
$ cd "my dir"
$ cd Documents
Espero que funcione?
Use o símbolo de barra invertida para escapar do espaço
C:\> cd my folder
Será
C:\> cd my\folder
Como uma alternativa ao uso de aspas, para uma pasta para a qual deseja ir frequentemente, poderá usar o cdable_vars
Opção de consola:
shopt -s cdable_vars
docs='/cygdrive/c/Users/my dir/Documents'
Agora, para mudar para essa pasta de qualquer lugar, você pode usar
cd docs
E a linha de comandos indicará qual a pasta para a qual mudou:
$ cd docs
/cygdrive/c/Users/my dir/Documents
Usa aspas!
cd "Name of Directory"
Ou você pode ir para o file explorer e clicar em "copy path" no canto superior esquerdo!
Em vez de:
DOCS="/cygdrive/c/Users/my\ dir/Documents"
Tenta:
DOCS="/cygdrive/c/Users/my dir/Documents"
Isto deve funcionar em qualquer sistema POSIX.