Como cd para um diretório com um nome contendo espaços no bash?


84

eu tentei cd "~/Library/Application Support/" -bash: cd: ~/Library/Application Support/: No such file or directory

Além disso cd ~/Library/Application Support/ -bash: cd: ~/Library/Application Support/: No such file or directory

Respostas:


113

Você pode usar a Tabtecla depois de pressionar os primeiros caracteres (isso "preencherá" o restante da pasta para você, por exemplo, digite cd ~/LTabpreenchimento cd ~/Library/e digite ApTabe preencherá o restante para você.

Se houver um espaço entre as palavras e você não quiser usar os métodos acima, coloque uma \(barra invertida) antes do espaço, por exemplo cd ~/Library/Application\ Support.


O caminho é sensível a maiúsculas ou minúsculas? Eu posso acessar a Biblioteca por cd ~ / library, mas o método tab não funcionará se eu estiver com o caso errado.
colinfang

@colinfang OS X não faz distinção entre maiúsculas e minúsculas, mas preserva. O shell bash deve ser um pouco mais exigente no que diz respeito ao preenchimento automático.
NReilingh

@NReilingh - Ah, thx.
Colinfang

1
@colinfang: Você pode usar shopt -s nocaseglobe bind 'set completion-ignore-case on'tornar o bash menos sensível ao caso.
Chris Johnsen

2
colinfang - Para concluir a guia sem distinção entre maiúsculas e minúsculas e com compatibilidade bash, tente 'zsh'. Além disso, a conclusão do curinga desse shell é muito boa.
Ɱark Ƭ

27

A questão principal aqui é como o shell ( bash ) faz citações e como isso afeta a expansão do til e a divisão em “palavras” (argumentos para o programa que está sendo executado).

o bash trata apenas o til principal, especialmente se não estiver entre aspas. Além disso, a barra a seguir também não deve ser citada.

Ao mesmo tempo, o bash analisa as linhas de comando em "palavras" com base no espaço em branco não citado. O cdcomando normalmente requer exatamente um argumento (o diretório de destino). Uma linha de comando como cd foo barsignifica executar cdcom dois argumentos: fooe bar. Se você deseja enviar apenas um foo barargumento, é necessário citar o espaço:
(por exemplo) cd foo\ bar(veja mais exemplos de citações abaixo).

Na sua situação específica, é necessário deixar o til e a barra a seguir sem aspas ao citar o espaço no nome do diretório. Sua cd "~/Library/Application Support/"avaliação acaba citando demais (o til e sua barra), enquanto sua cd ~/Library/Application Support/avaliação cita muito pouco (omite a citação do espaço no nome do diretório).

A solução mais comum é usar escape de um caractere para citar apenas o espaço:

    cd ~/Library/Application\ Support

Você também pode usar aspas simples ou duplas em torno do espaço ou do espaço e alguns outros bits desse argumento (mas não o ~/!):

    cd ~/Library/Application' 'Support
    cd ~/Library/Application" "Support
    cd ~/Library/App'lication 'Support
    cd ~/Library/Application" Supp"ort
    cd ~/'Library/Application 'Support
    cd ~/"Library/Application "Support

Esses tipos de citações têm significados diferentes, mas são idênticos nesses exemplos. As aspas simples protegem as cadeias literais, enquanto as aspas duplas permitem várias expansões e substituições na região entre aspas.

Muitas vezes, você pode simplesmente deixar o shell fazer o trabalho por você.

  • Globbing (curingas):

    cd ~/L*/Ap*

    Você pode usar shopt -s nocaseglobpara tornar a caixa invertida insensível:

    cd ~/l*/ap*
  • Conclusão:

    Pressionando Tabdepois de entrar cd ~/L, provavelmente, expandi-lo para cd ~/Library/.
    Pressionar Tabnovamente após entrar Ap(agora você tem cd ~/Library/Ap) provavelmente o expandirá para cd ~/Library/Application\ Support/(o shell inseriu automaticamente a barra invertida).

    Você pode usar bind 'set completion-ignore-case on'para tornar a conclusão sem distinção entre maiúsculas e minúsculas:

    cd ~/l Tabcd ~/Library/; ap Tabcd ~/Library/Application\ Support/


boa resposta @ Chris. Como você conseguiu que os caracteres da guia parecessem chaves?
Robzolkos

4
@RobZ: É a <kbd></kbd>tag HTML (uma das várias tags HTML suportadas na marcação SE ).
Chris Johnsen

9

Ao citar duas vezes um caminho, você está interrompendo a expansão do til. Portanto, existem algumas maneiras de fazer isso:

cd ~/"My Code"
cd ~/'My Code'

O til não é citado aqui, portanto a expansão do til ainda será executada.

cd "$HOME/My Code"

Você pode expandir variáveis ​​de ambiente dentro de cadeias de caracteres com aspas duplas; isso é basicamente o que a expansão til está fazendo

cd ~/My\ Code

Você também pode escapar de caracteres especiais (como espaço) com uma barra invertida.


9

Como alternativa, você também pode arrastar uma pasta para a janela do Terminal, o caminho completo do arquivo / pasta será colado automaticamente ao arrastar.


4

Você precisa escapar do espaço em " Application Support"

Experimentar $ cd ~/Library/Application\ Support/


0

Se as formas normais não funcionarem, tente substituir espaços por %20.

Isso funcionou para mim ao lidar com SSH e outros comandos no estilo de domínio, como auto_smb.


0

Você pode tentar fazer isso para pastas / arquivos espaçados, se o nome do arquivo ou da pasta contiver 1) nome do arquivo. Extensão o comando deve ser cd ~ / arquivo \ nome.extensão / (ou) cd ~ / "nome do arquivo.extensão" /


1
Como essa resposta difere ou melhora em qualquer uma das outras respostas semelhantes?
Fsb 23/05

É a sintaxe perfeita do terminal para definir espaço e fornecer cotações. É um dos definidos pelo usuário e também usando a tecla tab não leva o nome como 1) nome do arquivo.ext 2) nome do arquivo.ext Enquanto pressiona a tecla tab para esse tipo de nome, o auto a conclusão das palavras é exibida até "arquivo" naquele momento. Podemos usar essa barra invertida para definir o espaço no terminal. @fsp
prasanth sivanesan

Todas essas informações devem estar na resposta para mostrar aos leitores como é diferente das outras 9 respostas, incluindo a resposta aceita.
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.