50 votes

Comment entrer dans un fichier ou un répertoire dont le nom contient des caractères spéciaux ?

Je veux entrer le dossier suivant dans le terminal :

Milano, Torino (Jan)-Compressed

Comment dois-je écrire la commande cd pour entrer dans ce répertoire ?

Les espaces et plusieurs autres caractères spéciaux comme \ , * , ) , ( y ? posent des problèmes lorsque j'essaie de les utiliser en ligne de commande ou dans des scripts, par exemple :

$ 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 ?
(  )  *  ?  \

Comment saisir des noms de fichiers ou de répertoires contenant des caractères spéciaux dans le terminal en général ?

52voto

Henrik Points 2604

Cette commande est ambiguë car les espaces sont normalement utilisés pour séparer les arguments. cd ne sait pas ce que vous voulez faire mais vous avez deux possibilités pour le résoudre :

Soit vous " masque " les espaces (et tous les autres caractères spéciaux) afin que le terminal sache que l'espace est un caractère et non un séparateur :

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

Ou bien vous mettez le nom ou le chemin de votre dossier dans citations :

cd "Milano, Torino (Jan)-Compressed"

28voto

Achu Points 20537

Un petit conseil : achèvement de l'onglet ;-)

  1. Il suffit de taper la première lettre, par exemple cd Mi (ou plus si nécessaire) et appuyez sur Tab . Le terminal vous aidera à compléter les mots restants.

D'une autre manière : traîner y chute

  1. Si vous pouvez voir le répertoire et si vous voulez y accéder à l'aide du terminal, tapez simplement : cd puis glissez-déposez le répertoire sur le terminal et appuyez sur enter .

24voto

Prateek Points 2491

Rédigez-le comme suit :

cd 'Milano, Torino (Jan)-Compressed'

Dans le cas contraire, il traite Milano, comme nom de dossier. Cela se produit en raison des espaces dans le nom du dossier. Il est également possible d'échapper à certains caractères spéciaux :

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

22voto

dessert Points 36815

tl;dr : Pour citer un caractère spécial, il faut soit l'échapper avec une barre oblique inverse \ ou l'entourer d'un double " " ou des guillemets simples ' ' . Tab L'achèvement se charge de l'établissement des devis.


Ce que vous demandez s'appelle Citation :

La citation est utilisée pour supprimer la signification spéciale de certains caractères ou mots dans le Shell. ( ) Il existe trois mécanismes de citation : la caractère d'échappement , guillemets simples であり、また guillemets doubles . [citations extraites de <a href="http://manpages.ubuntu.com/manpages/xenial/en/man1/bash.1.html" rel="nofollow noreferrer"><code>man bash</code></a> ]

En citant le caractère d'échappement \

Une barre oblique inverse ( \ ) est le caractère d'échappement. Il préserve la valeur littérale du caractère suivant, à l'exception de <newline> .

Ainsi, pour entrer dans un répertoire ou un fichier avec un caractère spécial, échappez ce dernier avec \ , par exemple :

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 “?”

bash 's Achèvement programmable (alias Tab La complétion) échappe automatiquement les caractères spéciaux à l'aide du caractère d'échappement \ .

Citation entre guillemets " "

L'insertion de caractères entre guillemets doubles permet de conserver la valeur littérale de tous les caractères compris dans les guillemets, à l'exception des caractères suivants $ , ` , \ et, lorsque l'extension de l'historique est activée, ! .

Ainsi, pour entrer dans un répertoire ou un fichier avec un caractère spécial, échappez au moins la dernière partie ou une grande partie de votre nom de fichier ou de votre chemin d'accès avec des guillemets doubles, par exemple :

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 “?”

En tant que $ , ` y ! conservent leur signification particulière entre guillemets, Expansion des paramètres , Substitution de commande , Expansion arithmétique y Expansion de l'histoire sont effectuées sur des chaînes de caractères à double quotient.

Citation avec des guillemets simples ' '

L'insertion de caractères entre guillemets simples préserve la valeur littérale de chaque caractère entre guillemets. Un guillemet simple ne peut pas se trouver entre des guillemets simples, même s'il est précédé d'une barre oblique inverse.

Ainsi, pour entrer dans un répertoire ou un fichier avec un caractère spécial, échappez au moins la dernière partie ou une grande partie de votre nom de fichier ou de votre chemin d'accès avec des guillemets doubles, par exemple :

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 “\”

Vous trouverez plus d'informations sur les citations dans man bash /QUOTING , le wiki.bash-hackers.org et sur tldp.org .

11voto

Sergiy Kolodyazhnyy Points 97292

Chaînes de caractères en C et $'string

Il est possible, entre autres, d'utiliser $'...' pour utiliser les caractères backslash de l'ANSI-C, tels que \n y \t y compris ceux que vous avez mentionnés. Extrait du manuel de bash 4.3 :

Les mots de la forme $'string' sont traités de manière particulière. Le mot se développe en chaîne de caractères, avec remplacement des caractères échappés par le backslash, comme spécifié par la norme ANSI C.

Ceci est particulièrement utile pour les fichiers qui contiennent des nouvelles lignes, des tabulations, lorsque vous écrivez des lignes awk complexes où vous devez utiliser différentes façons de distinguer les guillemets simples et doubles, lorsque les noms de fichiers eux-mêmes contiennent un mélange de guillemets simples et doubles, etc.

Par exemple, la création et l'énumération de ces fichiers :

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

Vous pouvez utiliser les valeurs hexadécimales des caractères, telles que :

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

printf

Même idée que précédemment - tirer parti des caractères d'échappement :

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

Utiliser les inodes :

Chaque fichier ou répertoire est associé à une structure de données spéciale appelée inode, qui est référencée par un nombre décimal particulier. Vous pouvez donc l'utiliser pour localiser indirectement le fichier avec un inode particulier via find et en faire quelque chose :

$ 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

Évitez de traiter des fichiers individuels lorsque vous pouvez utiliser glob

Lorsque vous n'avez pas à vous occuper de fichiers individuels, il vous suffit de tirer parti de l'outil * dans Shell et de citer les variables lorsqu'elles sont transmises à d'autres commandes. Cela facilite grandement la gestion des noms de fichiers difficiles :

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

Notez l'utilisation de ./ - une protection contre les noms de fichiers qui peuvent contenir des caractères de tête - en eux.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X