Wie gehe ich zu einem Verzeichnis mit einem Namen, der Leerzeichen in Bash enthält?

84

Ich habe es versucht cd "~/Library/Application Support/" -bash: cd: ~/Library/Application Support/: No such file or directory

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

Colinfang
quelle

Antworten:

113

Sie können die Verwendung TabSchlüssel nach den ersten paar Zeichen drücken (dies wird dann „füllen“ den Rest des Ordners für Sie Typ zB cd ~/LTabfüllt cd ~/Library/dann geben , ApTabund es wird für Sie in den Rest füllen.

Wenn zwischen Wörtern ein Leerzeichen steht und Sie die oben genannten Methoden nicht verwenden möchten, setzen Sie einen \(Backslash) vor das Leerzeichen, z cd ~/Library/Application\ Support.

robzolkos
quelle
Ist der Pfad zwischen Groß- und Kleinschreibung oder unempfindlich? Ich kann über cd ~ / library auf Library zugreifen, aber die Tab-Methode funktioniert nicht, wenn die Groß- / Kleinschreibung falsch ist.
Colinfang
Bei @colinfang OS X wird die Groß- und Kleinschreibung nicht berücksichtigt, die Groß- und Kleinschreibung wird jedoch beibehalten. Die Bash-Shell muss etwas differenzierter sein, wenn es um die automatische Vervollständigung geht.
NReilingh
@NReilingh - Aha, danke.
Colinfang
1
@colinfang: Sie können mit shopt -s nocaseglobund bind 'set completion-ignore-case on'machen bash weniger empfindlich zu Fall.
Chris Johnsen
2
colinfang - Wenn Sie bei der Bash-Kompatibilität die Groß- und Kleinschreibung nicht beachten möchten, versuchen Sie 'zsh'. Auch die Wildcard-Vervollständigung dieser Shell ist sehr gut.
Ɱark Ƭ
27

Das Kernproblem hierbei ist, wie die Shell ( Bash ) das Zitieren durchführt und wie sich dies auf die Tilde-Erweiterung und die Aufteilung in „Wörter“ (Argumente für das ausgeführte Programm) auswirkt.

Bash behandelt die führende Tilde nur dann, wenn sie nicht in Anführungszeichen gesetzt ist. Darüber hinaus darf der folgende Schrägstrich nicht zitiert werden.

Gleichzeitig parst bash Befehlszeilen in "Wörter", die auf nicht in Anführungszeichen gesetzten Leerzeichen basieren. Der cdBefehl erfordert normalerweise genau ein Argument (das Zielverzeichnis). Eine Befehlszeile wie cd foo barbedeutet, cdmit zwei Argumenten ausgeführt zu werden: foound bar. Wenn Sie nur ein einziges foo barArgument senden möchten, müssen Sie das Leerzeichen angeben:
(z. B.) cd foo\ bar(siehe Beispiel weiter unten).

In Ihrer speziellen Situation müssen Sie die Tilde und den folgenden Schrägstrich nicht in Anführungszeichen setzen, während Sie das Leerzeichen im Verzeichnisnamen angeben. Ihre cd "~/Library/Application Support/"Testversion zitiert am Ende zu viel (die Tilde und ihr Schrägstrich), während Ihre cd ~/Library/Application Support/Testversion zu wenig zitiert (das Leerzeichen im Verzeichnisnamen wird nicht angegeben).

Die gebräuchlichste Lösung ist die Verwendung von Escape-Zeichen, um nur das Leerzeichen zu zitieren:

    cd ~/Library/Application\ Support

Sie können auch einfache oder doppelte Anführungszeichen verwenden, um entweder nur das Leerzeichen oder das Leerzeichen und einige andere Teile dieses Arguments (aber nicht das ~/!):

    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

Diese Arten von Anführungszeichen haben unterschiedliche Bedeutungen, sind jedoch in diesen Beispielen identisch. Einfache Anführungszeichen schützen wörtliche Zeichenfolgen, während doppelte Anführungszeichen verschiedene Erweiterungen und Ersetzungen in der angegebenen Region ermöglichen.

Oft können Sie einfach die Shell die Arbeit für Sie erledigen lassen.

  • Globbing (Platzhalter):

    cd ~/L*/Ap*

    Sie können verwenden shopt -s nocaseglob, um die Groß- und Kleinschreibung zu ignorieren:

    cd ~/l*/ap*
  • Fertigstellung:

    Wenn Sie Tabnach der Eingabe cd ~/Lauf drücken , wird es wahrscheinlich auf erweitert cd ~/Library/.
    Wenn Sie Tabnach der Eingabe erneut drücken Ap(Sie haben es jetzt cd ~/Library/Ap), wird es wahrscheinlich erweitert cd ~/Library/Application\ Support/(die Shell fügte automatisch den entstehenden Backslash ein).

    Sie können verwenden bind 'set completion-ignore-case on', um die Groß- und Kleinschreibung der Vervollständigung zu ignorieren:

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

Chris Johnsen
quelle
nette Antwort @Chris. Wie haben Sie die Tabulatoren so gestaltet, dass sie wie Tasten aussehen?
robzolkos
4
@RobZ: Dies ist das <kbd></kbd>HTML-Tag (eines von mehreren HTML-Tags, die in SE markdown unterstützt werden ).
Chris Johnsen
9

Wenn Sie einen Pfad in doppelte Anführungszeichen setzen, wird die Tilde-Erweiterung gestoppt. Es gibt also einige Möglichkeiten, dies zu tun:

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

Die Tilde wird hier nicht zitiert, daher wird die Tilde-Erweiterung weiterhin ausgeführt.

cd "$HOME/My Code"

Sie können Umgebungsvariablen innerhalb von Zeichenfolgen in doppelten Anführungszeichen erweitern. Dies ist im Grunde das, was die Tilde-Erweiterung macht

cd ~/My\ Code

Sie können Sonderzeichen (z. B. Leerzeichen) auch durch einen Backslash ersetzen.

Useralone
quelle
9

Alternativ können Sie einen Ordner auch einfach in das Terminal-Fenster ziehen. Der gesamte Datei- / Ordnerpfad wird beim Ziehen automatisch eingefügt.

Psychic2k
quelle
4

Sie müssen den Raum in " Application Support" entkommen

Versuchen $ cd ~/Library/Application\ Support/

NReilingh
quelle
0

Wenn die normalen Methoden nicht funktionieren, versuchen Sie, Leerzeichen durch zu ersetzen %20.

Dies funktionierte für mich beim Umgang mit SSH und anderen domänenartigen Befehlen wie auto_smb.

atwixtor
quelle
0

Sie können dies für verteilte Ordner / Dateien versuchen, indem Sie: Wenn die Datei oder der Ordnername 1) Dateiname.Erweiterung enthält, sollte der Befehl cd ~ / Datei \ Name.Erweiterung / (oder) cd ~ / "Dateiname.Erweiterung" / lauten.

prasanth sivanesan
quelle
1
Inwiefern unterscheidet oder verbessert sich diese Antwort gegenüber anderen, ähnlichen Antworten?
23.
Es ist die perfekte Terminalsyntax zum Definieren von Leerzeichen und zum Angeben von Anführungszeichen. Es ist eine benutzerdefinierte Syntax, und die Verwendung der Tabulatortaste verwendet nicht den Namen wie 1) Dateiname.ext 2) Dateiname.ext Die Vervollständigung der Wörter wird bis zu "file" angezeigt. Zu diesem Zeitpunkt können wir diesen Backslash verwenden, um den Platz im Terminal zu definieren. @fsp
prasanth sivanesan
Alle diese Informationen sollten in der Antwort enthalten sein, um den Lesern zu zeigen, wie sie sich von den 9 anderen Antworten unterscheiden, einschließlich der akzeptierten Antwort.
fsb