Wie gebe ich eine Datei oder ein Verzeichnis mit Sonderzeichen im Namen ein?

44

Ich möchte folgenden Ordner im Terminal eintragen:

Milano, Torino (Jan)-Compressed

Wie soll ich den Befehl schreiben, cdum in dieses Verzeichnis zu gelangen?

Spaces und einige andere Sonderzeichen wie \, *, ), (und ?verursachen Probleme , wenn ich versuche , sie in der Befehlszeile oder Skripte zu verwenden, zB:

$ cd space dir
bash: cd: space: No such file or directory

$ cat space file
cat: space: No such file or directory
cat: file: No such file or directory

$ cat (
bash: syntax error near unexpected token `newline'

$ echo content >\
> ^C

$ ls ?
(  )  *  ?  \

Wie gebe ich im Terminal generell Datei- oder Verzeichnisnamen ein, die Sonderzeichen enthalten?

Pomario
quelle
Siehe auch: Abschnitt 3.1.2. Zitieren des Bash-Referenzhandbuchs .
Eliah Kagan

Antworten:

43

Dieser Befehl ist nicht eindeutig, da normalerweise Leerzeichen zum Trennen von Argumenten verwendet werden. CD weiß nicht, was Sie tun möchten, aber Sie haben zwei Möglichkeiten, um es zu lösen:

Entweder " maskieren " Sie die Leerzeichen (und alle anderen Sonderzeichen), damit das Terminal weiß, dass Sie das Leerzeichen als Zeichen und nicht als Trennzeichen verstehen:

cd Milano\,\ Torino\ \(Jan\)-Compressed

Oder Sie setzen Ihren Ordnernamen oder Pfad in Anführungszeichen :

cd "Milano, Torino (Jan)-Compressed"
krystoph
quelle
26

Ein kleiner Tipp: Tab Vervollständigung ;-)

  1. Geben Sie einfach den ersten Buchstaben ein cd Mi(oder, falls erforderlich, mehrere Buchstaben) und drücken Sie Tab. Terminal hilft Ihnen, indem es die restlichen Wörter vervollständigt.

Ein anderer Weg: Ziehen und Ablegen

  1. Wenn Sie das Verzeichnis sehen und mit dem Terminal darauf zugreifen möchten, geben Sie einfach Folgendes ein: cdZiehen Sie das Verzeichnis mit der Maus auf das Terminal und drücken Sie enter.
Achu
quelle
24

Schreibe es als:

cd 'Milano, Torino (Jan)-Compressed'

Andernfalls wird es Milano,als Ordnername behandelt . Dies geschieht aufgrund der Leerzeichen im Namen des Ordners. Alternativ können Sie einige der Sonderzeichen umgehen:

cd Milano\,\ Torino\ \(Jan\)-Compressed/
Prateek
quelle
22

tl; dr : Um ein Sonderzeichen \in " "Anführungszeichen zu setzen, muss es entweder mit einem Backslash versehen oder in doppelte oder einfache Anführungszeichen eingeschlossen werden ' '. Tab ↹Die Vervollständigung sorgt für eine korrekte Preisangabe.


Was Sie verlangen, heißt Zitieren :

Das Zitieren wird verwendet, um die spezielle Bedeutung bestimmter Zeichen oder Wörter in der Shell zu entfernen. (…) Es gibt drei Anführungszeichen : das Escape-Zeichen , einfache Anführungszeichen und doppelte Anführungszeichen . [Zitate entnommen aus man bash]

Zitieren mit dem Escape-Charakter \

Ein Backslash ( \) ohne Anführungszeichen ist das Escape-Zeichen. Es behält den Literalwert des nächsten folgenden Zeichens bei, mit Ausnahme von <newline>.

Um also ein Verzeichnis oder eine Datei mit einem Sonderzeichen einzugeben, verlassen Sie letzteres mit \zB:

cd space\ dir      # change into directory called “space dir”
cat space\ file    # print the content of file “space file”
echo content > \\  # print “content” into file “\”
cat \(             # print the content of file “(”
ls -l \?           # list file “?”

bashDurch die programmierbare Vervollständigung (auch als Tab ↹Vervollständigung bezeichnet) werden Sonderzeichen automatisch mit dem Escape-Zeichen ausgeblendet \.

Zitieren mit doppelten Anführungszeichen " "

Zeichen in doppelten Anführungszeichen bewahrt den wörtlichen Wert aller Zeichen innerhalb der Anführungszeichen, mit Ausnahme von umschließenden $, `, \, und, wenn die Geschichte Erweiterung aktiviert ist, !.

Wenn Sie also ein Verzeichnis oder eine Datei mit einem Sonderzeichen eingeben möchten, müssen Sie mindestens das letztere oder einen größeren Teil Ihres Dateinamens oder Pfads in doppelte Anführungszeichen setzen, z.

cd space" "dir     # change into directory called “space dir”
cd spac"e di"r     # equally
cd "space dir"     # equally
cat "space file"   # print the content of file “space file”
cat "("            # print the content of file “(”
ls -l "?"          # list file “?”

Wie $, `und !hält ihre besondere Bedeutung in doppelten Anführungszeichen, Parameter Expansion , Befehl Substitution , Arithmetic Erweiterung und Expansion Geschichte auf Strings in doppelten Anführungszeichen ausgeführt.

Zitieren mit einfachen Anführungszeichen ' '

Das Einschließen von Zeichen in einfache Anführungszeichen behält den Literalwert jedes Zeichens in den Anführungszeichen bei. Ein einfaches Anführungszeichen darf nicht zwischen einfachen Anführungszeichen stehen, auch wenn ein Backslash vorangestellt ist.

Wenn Sie also ein Verzeichnis oder eine Datei mit einem Sonderzeichen eingeben möchten, müssen Sie mindestens das letztere oder einen größeren Teil Ihres Dateinamens oder Pfads in doppelte Anführungszeichen setzen, z.

cd space' 'dir     # change into directory called “space dir”
cd spac'e di'r     # equal
cd 'space dir'     # equal
cat 'space file'   # print the content of file “space file”
cat '('            # print the content of file “(”
ls -l '?'          # list file “?”
echo content > '\' # print “content” into file “\”

Weitere man bashInformationen zum Zitieren finden Sie in / QUOTING , auf wiki.bash-hackers.org und auf tldp.org .

Dessert
quelle
10

C-ähnliche Strings und $ 'string'

Unter anderem kann die $'...'Art der Anführungszeichen verwendet werden, um ANSI-C-Backslash-Zeichen wie \nund zu verwenden \t, einschließlich der von Ihnen erwähnten. Ab bash 4.3 Handbuch:

Wörter der Form $ 'string' werden speziell behandelt. Das Wort wird zu einer Zeichenfolge erweitert, wobei mit einem Backslash versehene Zeichen gemäß dem ANSI C-Standard ersetzt werden.

Dies ist besonders nützlich bei Dateien, die Zeilenumbrüche und Tabulatoren enthalten, wenn Sie komplexe AWK - Zeilen schreiben, bei denen Sie zwischen einfachen und doppelten Anführungszeichen auf unterschiedliche Weise unterscheiden müssen, wenn Dateinamen selbst einfache / doppelte Anführungszeichen enthalten, usw.

So können Sie beispielsweise solche Dateien erstellen und auflisten:

$ touch a$'*'b  c$'\n'd                                                     
$ ls  a$'*'b  c$'\n'd                                                       
a*b  c?d

Sie können hexadezimale Zeichenwerte verwenden, z.

$ touch 'file(name'
$ ls file$'\x28'name
file(name

printf

Gleiche Idee wie zuvor - nutzen Sie Fluchtzeichen:

$ ls "$(printf "file\x28name")"                                             
file(name
$ echo "Hello World"  >  c$'\n'd                                            
$ cat "$(printf "c\nd")"                                                    
Hello World

Verwenden Sie Inodes:

Jeder Datei oder jedem Verzeichnis ist eine spezielle Datenstruktur zugeordnet, die als Inode bezeichnet wird und auf die durch eine bestimmte Dezimalzahl verwiesen wird. Sie können das also verwenden, um die Datei mit einem bestimmten Inode indirekt über einen findBefehl zu lokalisieren und etwas damit zu tun:

$ echo "This is a test" > file$'('name1
$ ls -i
5898996 file(name1  5898997 file?name2
$ find -type f -inum "5898996" -exec cat {} \;
This is a test

Vermeiden Sie den Umgang mit einzelnen Dateien, wenn Sie glob verwenden können

Wenn Sie sich nicht mit einzelnen Dateien befassen müssen, nutzen Sie einfach das *Glob-Zeichen in der Shell und zitieren Sie Variablen, wenn Sie sie an andere Befehle übergeben. Dies erleichtert den Umgang mit schwierigen Dateinamen erheblich:

$ for f in ./*; do echo "$f" ; done
file    name2
file(name1

Beachten Sie die Verwendung von ./- als Schutz vor Dateinamen, die möglicherweise führende Zeichen enthalten -.

Sergiy Kolodyazhnyy
quelle
6

Um einen Ordner zu öffnen, der ein Leerzeichen enthält, setzen Sie diesen in Anführungszeichen cd "Some Directory"oder schließen Sie das Leerzeichen mit einem Backslash ab cd /home/kudic/Radna\ površina.

Corey Whitaker
quelle
3
Oder entkommen Sie dem Raum mit einem Backslash wie:cd /home/kudic/Radna\ površina
Timo
Großartiger Punkt! Ich habe vergessen, das zu erwähnen. Normalerweise verwende ich Anführungszeichen aus Gewohnheit, aber der Backslash ist auf lange Sicht eigentlich besser.
Corey Whitaker
1
Oder verwenden Sie einfache Anführungszeichen ( 'Radna površina'), wenn Umgebungsvariablen ( $VARNAME) nicht erweitert und Befehle nicht in Backticks eingeschlossen oder ausgeführt werden $()sollen (oder wenn der Dateiname doppelte Anführungszeichen enthält).
Eliah Kagan
3

Befindet sich dieses Verzeichnis in Ihrem privaten Ordner, geben Sie Folgendes ein:

cd "Milano, Torino (Jan)-Compressed"

sonst absoluten Pfad angeben:

cd "/…/…/Milano, Torino (Jan)-Compressed"

Wenn der Dateiname ein doppeltes Anführungszeichen enthält, schließen Sie das mit \"

Harshveer Singh
quelle
Wenn Sie einen Pfad mit einem führenden Schrägstrich beginnen, wird er von root aus gestartet. Vielleicht möchten Sie das entfernen.
Isaaclw
@isaaclw Deshalb hat er es als absoluten Pfad abgelegt: P
1
Ah, das sind drei Punkte, die auf einen "variablen" Ordner hinweisen. Ich nahm an, dass es zwei Punkte waren, die "Elternordner" anzeigen. Entschuldigung.
Isaaclw
3

Eine andere Option, obwohl nicht die beste in diesem Fall, ist die Verwendung von Platzhaltern. Du kannst es versuchen:

cd *Torino*

Verwenden Sie diese Methode am besten, wenn der Name eines Verzeichnisses ein bestimmtes Wort oder einen bestimmten Ausdruck enthält, das bzw. der nicht von anderen geteilt wird. Zum Beispiel habe ich Mount-Punkte / media / DataSSD und / media / DataHDD. Die automatische Vervollständigung funktioniert erst, wenn ich fast die Hälfte des Namens eingebe. Um zu meiner Festplattenpartition zu gelangen, tippe ich einfach

cd /media/*HD*

user242845
quelle