Comment entrer un fichier ou un répertoire avec des caractères spéciaux dans son nom?

34

Je souhaite 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 tels que \ , * , ) , ( et ? posent des problèmes lorsque je tente de les utiliser dans la ligne de commande ou les 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 entrer des noms de fichiers ou de répertoires contenant des caractères spéciaux dans le terminal en général?

    
posée Pomario 05.02.2012 - 12:58
la source

8 réponses

37

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 masquez les espaces (et tous les autres caractères spéciaux) pour que le terminal sache que vous entendez l’espace comme un caractère et non comme un séparateur:

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

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

cd "Milano, Torino (Jan)-Compressed"
    
réponse donnée krystoph 05.02.2012 - 13:05
la source
23

Ecrivez-le comme

cd 'Milano, Torino (Jan)-Compressed'

Sinon, Milano, est considéré comme le nom du dossier. Cela se produit en raison des espaces dans le nom du dossier.

Sinon, évitez quelques-uns des caractères spéciaux ...

cd Milano\,\ Torino\ \(Jan\)-Compressed/
    
réponse donnée Prateek 05.02.2012 - 12:59
la source
22

Un petit conseil: complétion par tabulation :)

  1. Tapez simplement la première lettre, par exemple cd Mi (ou plusieurs lettres si nécessaire) et appuyez sur Tab . Terminal vous aidera en complétant les mots restants.

Une autre façon: faire glisser et supprimer

  1. Si vous pouvez voir le répertoire et si vous voulez y accéder en utilisant terminal, tapez simplement: cd d'abord, puis faites glisser le répertoire sur le terminal et appuyez sur entrez .
réponse donnée Achu 05.02.2012 - 13:35
la source
21

tl; dr : pour citer un caractère spécial, échappez-le avec une barre oblique inverse \ ou placez-le en double " " ou en guillemets simples ' ' . Onglet L'achèvement prend en charge les citations correctes.

Ce que vous demandez s'appelle Citant :

  

La citation est utilisée pour supprimer la signification particulière de certains caractères ou mots dans le shell. (...) Il existe trois mécanismes de citation: le caractère d'échappement , guillemets simples et guillemets doubles .    [citations tirées de man bash ]

Citation avec le caractère d'échappement \

  

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

Donc, pour entrer 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 (aka onglet achèvement) échappe aux caractères spéciaux avec le caractère d'échappement \ .

Citation avec guillemets doubles " "

  

Enfermer les caractères entre guillemets conserve la valeur littérale de tous les caractères entre guillemets, à l'exception de $ , ' , \ et, lorsque l'extension de l'historique est activée, ! .

Donc, pour entrer un répertoire ou un fichier avec un caractère spécial, échappez au moins le dernier ou la plus grande partie de votre nom de fichier ou chemin 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 “?”

Comme $ , ' et ! conservent leur signification particulière entre guillemets, Extension de paramètres , Substitution de commandes , Extension arithmétique et Extension de l'historique sont effectuées sur des chaînes entre guillemets doubles.

Citant avec des guillemets simples ' '

  

Enfermer des caractères entre guillemets simples conserve la valeur littérale de chaque caractère dans les guillemets. Un seul devis peut ne pas apparaître entre des guillemets simples, même s'il est précédé d'une barre oblique inverse.

Donc, pour entrer un répertoire ou un fichier avec un caractère spécial, échappez au moins le dernier ou la plus grande partie de votre nom de fichier ou chemin 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 Citation dans man bash / QUOTING , sur wiki.bash-hackers.org et sur tldp.org .

    
réponse donnée dessert 09.12.2017 - 22:31
la source
9

chaînes de type C et $ 'chaîne'

Entre autres choses, on peut utiliser le type de citation $'...' pour utiliser des barres obliques inverses ANSI-C telles que \n et \t , y compris celles que vous avez mentionnées. A partir du manuel bash 4.3:

  

Les mots de la forme $ 'string' sont traités spécialement. Le mot s'agrandit   to string, avec des caractères d'échappement antislash remplacés comme spécifié   par la norme ANSI C.

Ceci est particulièrement utile avec les fichiers qui contiennent des lignes nouvelles, des onglets, lorsque vous écrivez des lignes complexes où vous devez utiliser différentes manières de distinguer les guillemets simples et doubles, lorsque les noms de fichiers contiennent des guillemets simples / doubles. etc.

Par exemple, créer et répertorier de tels fichiers:

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

Vous pouvez utiliser des valeurs hexadécimales, telles que:

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

printf

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

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

Utiliser des inodes:

Chaque fichier ou répertoire est associé à une structure de données spéciale appelée inode, 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 la commande find , et faire quelque chose avec cela:

$ 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 à gérer des fichiers individuels, profitez simplement du caractère * glob dans les variables shell et quote lorsque vous les transmettez à d’autres commandes. Il est beaucoup plus facile de traiter des noms de fichiers difficiles:

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

Notez l’utilisation de ./ - une sauvegarde contre les noms de fichiers qui peuvent contenir des informations - .

    
réponse donnée Sergiy Kolodyazhnyy 09.12.2017 - 22:43
la source
6

Pour ouvrir un dossier contenant un espace, entourez-le par des guillemets comme cd "Some Directory" ou échappez à l'espace avec une barre oblique inverse, comme: cd /home/kudic/Radna\ površina .

    
réponse donnée Corey Whitaker 10.07.2012 - 15:41
la source
3

Si ce répertoire est dans votre dossier personnel, tapez:

cd "Milano, Torino (Jan)-Compressed"

sinon donnez le chemin absolu:

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

s'il y a un guillemet double dans le nom du fichier, alors échappez-le avec \"

    
réponse donnée Harshveer Singh 05.02.2012 - 13:00
la source
3

Une autre option, bien que pas la meilleure, consiste à utiliser des caractères génériques. Vous pouvez essayer:

cd *Torino*

Il est préférable d'utiliser cette méthode lorsqu'il existe un mot ou une phrase distincte dans le nom d'un répertoire non partagé par d'autres. Par exemple, j'ai des points de montage / media / DataSSD et / media / DataHDD. La complétion automatique ne fonctionne pas tant que je n'ai pas tapé la moitié du nom pour accéder à la partition de mon disque dur que je saisis simplement

cd /media/*HD*

    
réponse donnée user242845 02.02.2014 - 18:38
la source

Lire d'autres questions sur les étiquettes