Come eseguire il cd in una directory con un nome contenente spazi in bash?


84

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

anche cd ~/Library/Application Support/ -bash: cd: ~/Library/Application Support/: No such file or directory

Risposte:


113

Puoi usare il Tabtasto dopo aver premuto i primi pochi caratteri (questo "riempirà" il resto della cartella per te, ad esempio digita cd ~/LTabriempie cd ~/Library/quindi digita ApTabe riempirà il resto per te.

Se c'è uno spazio tra le parole e non vuoi usare i metodi sopra, metti una \barra rovesciata prima dello spazio, ad es cd ~/Library/Application\ Support.


Il percorso è sensibile al maiuscolo / minuscolo o insensibile? Posso accedere a Library tramite cd ~ / library, ma il metodo tab non funzionerà se ho sbagliato la causa.
Colinfang,

@colinfang OS X non distingue tra maiuscole e minuscole, ma preserva le maiuscole. La shell bash deve essere un po 'più discriminante quando si tratta di completare automaticamente.
NReilingh,

@NReilingh - Aha, thx.
Colinfang,

1
@colinfang: è possibile utilizzare shopt -s nocaseglobe bind 'set completion-ignore-case on'per rendere bash meno sensibile al caso.
Chris Johnsen,

2
colinfang - Per un completamento senza distinzione tra maiuscole e minuscole con compatibilità bash, prova "zsh". Anche il completamento con caratteri jolly di questa shell è molto buono.
Ɱark Ƭ

27

Il problema principale qui è come la shell ( bash ) fa il preventivo e come questo influenza l'espansione della tilde e la suddivisione in "parole" (argomenti per il programma in esecuzione).

bash tratta la tilde principale solo se non viene quotata. Inoltre, anche la seguente barra non deve essere quotata.

Allo stesso tempo, bash analizza le righe di comando in "parole" basate su spazi bianchi non quotati. Il cdcomando richiede in genere esattamente un argomento (la directory di destinazione). Una riga di comando come cd foo barsignifica eseguire cdcon due argomenti: fooe bar. Se desideri solo inviare un singolo foo barargomento, devi citare lo spazio:
(ad es.) cd foo\ bar(Vedi più esempi di citazioni di seguito).

Nella tua situazione particolare, è necessario lasciare la tilde e la seguente barra non quotate mentre si cita lo spazio nel nome della directory. La tua cd "~/Library/Application Support/"prova finisce per citare troppo (la tilde e la sua barra), mentre la tua cd ~/Library/Application Support/prova cita troppo poco (omette di citare lo spazio nel nome della directory).

La soluzione più comune è usare l'escaping a carattere singolo per citare solo lo spazio:

    cd ~/Library/Application\ Support

Puoi anche usare virgolette singole o doppie attorno solo allo spazio o allo spazio e ad alcuni altri bit di quell'argomento (ma non il ~/!):

    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

Questi tipi di virgolette hanno significati diversi, ma sono identici in questi esempi. Le virgolette singole proteggono stringhe letterali mentre le virgolette doppie consentono varie espansioni e sostituzioni nella regione quotata.

Spesso, puoi semplicemente lasciare che la shell faccia il lavoro per te.

  • Globbing (caratteri jolly):

    cd ~/L*/Ap*

    È possibile utilizzare shopt -s nocaseglobper rendere insensibile il caso globbing:

    cd ~/l*/ap*
  • Completamento:

    Premendo Tabdopo aver immesso cd ~/Lprobabilmente lo espanderà a cd ~/Library/.
    Premendo di Tabnuovo dopo aver inserito Ap(ora hai cd ~/Library/Ap) probabilmente lo espanderai a cd ~/Library/Application\ Support/(la shell ha inserito automaticamente la barra rovesciata di escape).

    È possibile utilizzare bind 'set completion-ignore-case on'per rendere insensibile al maiuscolo / minuscolo:

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


bella risposta @ Chris. Come hai fatto ad avere i caratteri Tab come tasti?
robzolkos,

4
@RobZ: è il <kbd></kbd>tag HTML (uno dei numerosi tag HTML supportati nel markdown SE ).
Chris Johnsen,

9

Quando citate due volte un percorso, interrompete l'espansione della tilde. Quindi ci sono alcuni modi per farlo:

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

La tilde non è quotata qui, quindi l'espansione della tilde verrà comunque eseguita.

cd "$HOME/My Code"

È possibile espandere le variabili di ambiente all'interno di stringhe tra virgolette doppie; questo è fondamentalmente ciò che sta facendo l'espansione della tilde

cd ~/My\ Code

Puoi anche sfuggire a personaggi speciali (come lo spazio) con una barra rovesciata.


9

In alternativa, puoi semplicemente trascinare una cartella nella finestra Terminale, il percorso completo di file / cartella verrà incollato automaticamente al trascinamento.


4

Devi fuggire dallo spazio in " Application Support"

Provare $ cd ~/Library/Application\ Support/


0

Se i modi normali non funzionano, prova a sostituire gli spazi con %20.

Questo ha funzionato per me quando ho a che fare con SSH e altri comandi simili a domini auto_smb.


0

Puoi provare questo per cartelle / file distanziati da Se il nome del file o della cartella contiene 1) nome file.estensione Il comando deve essere cd ~ / file \ nome.eestensione / (o) cd ~ / "nome file.estensione" /


1
In che modo questa risposta differisce o migliora su qualsiasi altra, simile, risposte?
fsb,

È la sintassi terminale perfetta per definire lo spazio e dare le virgolette è una delle definizioni definite dall'utente e anche l'uso del tasto tab non prende il nome come 1) nomefile.ext 2) nome file.ext Mentre si preme tab per questo tipo di nome il completamento delle parole viene visualizzato fino a "file" in quel momento possiamo usare questa barra rovesciata per definire lo spazio nel terminale. @fsp
prasanth sivanesan,

Tutte queste informazioni dovrebbero essere nella Risposta per mostrare ai lettori come sono diverse dalle altre 9 Risposte, inclusa la Risposta accettata.
fsb,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.