web-dev-qa-db-fra.com

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

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

42
Pomario

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 vous entendez l'espace en tant que caractère et non en tant que séparateur:

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

Ou vous mettez votre nom de dossier ou votre chemin dans guillemets:

cd "Milano, Torino (Jan)-Compressed"
43
krystoph

Un petit conseil: complétion de l'onglet ;-)

  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: glisser et déposer

  1. Si vous pouvez voir le répertoire et si vous souhaitez y accéder à l'aide d'un terminal, tapez simplement: cdpuis faites glisser le répertoire sur le terminal et appuyez sur enter.
26
Achu

Écrivez-le comme:

cd 'Milano, Torino (Jan)-Compressed'

Sinon, Milano, est traité comme nom de dossier. Cela se produit à cause des espaces dans le nom du dossier. Vous pouvez également échapper quelques caractères spéciaux:

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

tl; dr : pour citer un caractère spécial, écrivez-le avec une barre oblique inverse \ ou placez-le entre doubles " " ou guillemets simples ' 'Tab ↹ L'achèvement prend soin de la citation correcte.


Ce que vous demandez s'appelle . Citant :

La citation est utilisée pour supprimer la signification particulière de certains caractères ou mots du 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 non-citée (\) est le caractère d'échappement. Il conserve la valeur littérale du caractère suivant, à l'exception de <newline>.

Donc, pour entrer dans un répertoire ou un fichier avec un caractère spécial, échappez-le 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 Tab ↹ Completion) échappe automatiquement aux caractères spéciaux avec le caractère d'échappement \.

Citation avec doubles guillemets " "

Le fait de placer des caractères entre guillemets doubles préserve la valeur littérale de tous les caractères figurant entre guillemets, à l'exception de $, `, \ et, lorsque le développement de l'historique est activé, !.

Donc, pour entrer dans un répertoire ou un fichier avec un caractère spécial, échappez au moins ce dernier ou une plus grande partie de votre nom de fichier ou de votre chemin avec des guillemets, 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, Expansion des paramètres , Substitution de commande , Expansion arithmétique et Expansion de l'historique sont effectuées sur des chaînes entre guillemets.

Citation avec guillemets simples ' '

Le fait de placer des caractères entre guillemets simples préserve la valeur littérale de chaque caractère entre guillemets. Un seul guillemet ne peut pas apparaître entre guillemets, même s'il est précédé d'une barre oblique inverse.

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

22
dessert

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

Entre autres choses, on peut utiliser le type de citation $'...' pour utiliser les caractères de barre oblique inverse ANSI-C tels que \n et \t, y compris ceux que vous avez mentionnés. De bash 4.3 manuel:

Les mots de la forme $ 'chaîne' sont traités spécialement. Word se développe en chaîne, avec les caractères d'échappement avec une barre oblique inversée remplacés comme spécifié par la norme ANSI C.

Ceci est particulièrement utile pour les fichiers contenant des sauts de ligne, des tabulations, lorsque vous écrivez des lignes awk complexes dans lesquelles vous devez utiliser différentes méthodes pour distinguer les guillemets simples et doubles, lorsque les noms de fichiers contiennent eux-mêmes un méli-mélo de guillemets simple/double, etc.

Par exemple, créer et lister 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 de caractères, telles que:

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

printf

Même idée qu'auparavant - profitez des caractères d'échappement:

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

Utilisez 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. Donc, vous pouvez l'utiliser pour localiser indirectement le fichier avec un inode particulier via la commande 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 à traiter de fichiers individuels, tirez simplement profit du caractère globulaire * dans Shell et citez les variables lorsque vous les transmettez à d’autres commandes. Cela facilite beaucoup le traitement 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 le - en tête.

10

Pour ouvrir un dossier contenant un espace, placez-le entre guillemets tels que cd "Some Directory" ou échappez-le à l'aide d'une barre oblique inverse, telle que: cd /home/kudic/Radna\ površina.

6
Corey Whitaker

Une autre option, mais pas la meilleure dans ce cas, consiste à utiliser des caractères génériques. Tu peux essayer:

cd *Torino*

Il est préférable d'utiliser cette méthode lorsqu'il existe un mot ou une expression 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 saisie semi-automatique ne fonctionne pas tant que je n'ai pas saisi presque la moitié du nom. Pour accéder à la partition du disque dur, je tape simplement

cd /media/*HD*

3
user242845

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

cd "Milano, Torino (Jan)-Compressed"

sinon donner un chemin absolu:

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

s'il y a une double citation dans le nom du fichier, alors échappez-la avec \"

3
Harshveer Singh