¿Cómo ingreso un archivo o directorio con caracteres especiales en su nombre?

44

Quiero ingresar la siguiente carpeta en la terminal:

Milano, Torino (Jan)-Compressed

¿Cómo debo escribir el comando cdpara ingresar a este directorio?

Los espacios y otros caracteres especiales como \, *, ), (y ?causan problemas cuando trato de usarlos en la línea de comandos o secuencias de comandos, por ejemplo:

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

¿Cómo ingreso los nombres de archivo o directorio que contienen caracteres especiales en el terminal en general?

Pomario
fuente
Relacionado: Sección 3.1.2. Cita del manual de referencia de Bash .
Eliah Kagan

Respuestas:

44

Ese comando es ambiguo porque los espacios se usan normalmente para separar argumentos. cd no sabe lo que quieres hacer pero tienes dos posibilidades para resolverlo:

O bien " enmascaras " los espacios (y todos los demás caracteres especiales) para que el terminal sepa que te refieres al espacio como un carácter y no como un separador:

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

O pones el nombre o la ruta de tu carpeta entre comillas :

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

Un pequeño consejo: completar pestañas ;-)

  1. Simplemente escriba la primera letra, por ejemplo cd Mi(o más letras si es necesario) y presione Tab. Terminal te ayudará completando las palabras de descanso.

Otra forma: arrastrar y soltar

  1. Si puede ver el directorio y desea acceder a él usando la terminal, simplemente escriba: cdprimero y luego arrastre y suelte el directorio en la terminal y presione enter.
Achu
fuente
24

Escríbelo como:

cd 'Milano, Torino (Jan)-Compressed'

De lo contrario, se trata Milano,como el nombre de la carpeta. Esto sucede debido a los espacios en el nombre de la carpeta. Alternativamente, escapa de algunos de los caracteres especiales:

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

tl; dr : para citar un carácter especial, puede escaparlo con una barra diagonal inversa \o encerrarlo entre " "comillas dobles o simples ' '. Tab ↹La finalización se encarga de las citas adecuadas.


Lo que estás pidiendo se llama Citar :

Las comillas se utilizan para eliminar el significado especial de ciertos caracteres o palabras al shell. (...) Hay tres mecanismos de comillas : el carácter de escape , comillas simples y comillas dobles . [citas tomadas de man bash]

Citando con el personaje de escape \

Una barra invertida no citada ( \) es el carácter de escape. Conserva el valor literal del siguiente carácter que sigue, con la excepción de <newline>.

Entonces, para ingresar un directorio o un archivo con un carácter especial, escape de este último con \, por ejemplo:

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

bashLa finalización programable (también conocida como Tab ↹finalización) escapa automáticamente de caracteres especiales con el carácter de escape \.

Citando con comillas dobles " "

Encerrar caracteres entre comillas dobles preserva el valor literal de todos los caracteres dentro de las comillas, con la excepción de $, `, \, y, cuando se habilita la expansión de historia, !.

Entonces, para ingresar un directorio o un archivo con un carácter especial, escape al menos el último o una mayor parte de su nombre de archivo o ruta con comillas dobles, por ejemplo:

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

Como $, `y !mantenga su significado especial dentro de las comillas dobles, la expansión de parámetros , la sustitución de comandos , la expansión aritmética y la expansión de historial se realizan en cadenas de comillas dobles.

Citando con comillas simples ' '

El encerrar caracteres entre comillas simples conserva el valor literal de cada carácter dentro de las comillas. Es posible que no se produzca una comilla simple entre comillas simples, incluso cuando esté precedida por una barra diagonal inversa.

Entonces, para ingresar un directorio o un archivo con un carácter especial, escape al menos el último o una mayor parte de su nombre de archivo o ruta con comillas dobles, por ejemplo:

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

Puede encontrar más información sobre las citas en man bash/ QUOTING , en wiki.bash-hackers.org y en tldp.org .

postre
fuente
10

C-como cadenas y $ 'cadena'

Entre otras cosas, uno puede usar el $'...'tipo de comillas para hacer uso de caracteres de barra diagonal inversa ANSI-C como \ny \t, incluidos los que ha mencionado. Del manual bash 4.3:

Las palabras de la forma $ 'string' se tratan especialmente. La palabra se expande a cadena, con los caracteres con barra invertida reemplazados según lo especificado por el estándar ANSI C.

Esto es particularmente útil con archivos que contienen líneas nuevas, pestañas, cuando está escribiendo líneas awk complejas en las que necesita utilizar diferentes formas de distinguir entre comillas simples y dobles, cuando los nombres de los archivos contienen comillas simples / dobles, etc.

Por ejemplo, crear y enumerar dichos archivos:

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

Puede utilizar valores hexadecimales de caracteres, como:

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

printf

La misma idea que antes: aprovecha los caracteres de escape:

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

Use inodes:

Cada archivo o directorio tiene una estructura de datos especial asociada a él llamada inodo, a la que hace referencia un número decimal particular. Entonces puede usar eso para ubicar indirectamente el archivo con un inodo particular a través del findcomando, y hacer algo con él:

$ 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

Evite tratar con archivos individuales cuando puede usar glob

Cuando no tenga que lidiar con archivos individuales, simplemente aproveche el *carácter glob en el shell y cite las variables al pasarlas a otros comandos. Hace que lidiar con nombres de archivo difíciles sea mucho más fácil:

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

Tenga en cuenta el uso de ./: una protección contra los nombres de archivo que pueden contener caracteres principales -.

Sergiy Kolodyazhnyy
fuente
6

Para abrir una carpeta que contiene un espacio rodearla entre comillas como cd "Some Directory"o escapar del espacio con una barra invertida, como: cd /home/kudic/Radna\ površina.

Corey Whitaker
fuente
3
O escapar del espacio con una barra invertida, como:cd /home/kudic/Radna\ površina
Timo
Gran punto! Me olvidé de mencionar eso. Normalmente uso comillas por costumbre, pero la barra invertida es mejor usarla a largo plazo.
Corey Whitaker
1
O use comillas simples ( 'Radna površina'), si no desea que las variables de entorno ( $VARNAME) se expandan y los comandos se encierren en comillas inversas o $()se ejecuten (o si hay comillas dobles en el nombre del archivo).
Eliah Kagan
3

Si este directorio está en su carpeta de inicio, escriba:

cd "Milano, Torino (Jan)-Compressed"

de lo contrario dar ruta absoluta:

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

si hay una comilla doble en el nombre del archivo, entonces escape con \"

Harshveer Singh
fuente
Si comienza una ruta con una barra inclinada hacia adelante, va desde la raíz. Es posible que desee eliminar eso.
isaaclw
@isaaclw Por eso lo archivó como una ruta absoluta: P
1
Ah, son tres puntos, lo que indica una carpeta "variable". Supuse que eran dos puntos, lo que indica "carpeta principal". Disculpas
isaaclw
3

Otra opción, aunque no la mejor en este caso, es usar comodines. Puedes probar:

cd *Torino*

Es mejor usar este método cuando hay una palabra o frase distinta en el nombre de un directorio que otros no comparten. Por ejemplo, tengo puntos de montaje / media / DataSSD y / media / DataHDD. El autocompletado no funciona hasta que escribo casi la mitad del nombre, así que para acceder a mi partición de HDD solo escribo

cd /media/*HD*

usuario242845
fuente