¿Cómo escapo un nombre de subdirectorio con un ampersand en él?

9

Ejecutando un kornshell e intentando atravesar un árbol de directorios. Quiere cd a un subdirectorio llamado de la siguiente manera:

 -3ab_&_-3dc.img

Mi pregunta es ¿CÓMO necesito escapar del ampersand en este nombre? He probado diferentes combinaciones de comillas dobles y barras invertidas sin éxito.

RCinICT
fuente

Respuestas:

11

Para el &(o casi cualquier otro personaje, tienes dos posibilidades simples.

  • Pon comillas simples alrededor de todo: ' -3ab_&_-3dc.img'
  • Ponga una barra diagonal inversa antes de cada personaje problemático: -3ab_\&_-3dc.img

Hay dos excepciones:

  • El método de comillas simples no funciona para una comilla simple. La barra diagonal inversa no es especial entre comillas simples, por lo que tampoco puede usarla directamente. Lo que puede hacer es finalizar la cadena entre comillas simples, usar inmediatamente la barra diagonal inversa más la comilla simple y reiniciar la comilla simple. Así, por ejemplo, si el nombre del directorio es foo'bar\qux: cd 'foo'\''bar\qux'. Puedes recordarlo de esa manera: dentro de comillas simples, '\''obtienes una sola cita.
  • El método de barra diagonal inversa no funciona para las nuevas líneas: simplemente se ignora la barra diagonal inversa. Debe poner comillas simples alrededor de una nueva línea.

También puede usar comillas dobles, pero luego debe poner una barra diagonal inversa antes de algunos caracteres. Las comillas simples son más sencillas.

Aquí hay una dificultad adicional, que es que el nombre del directorio comienza con un guión. Ese personaje le dice al cdcomando (como casi todos los comandos) que sigue una opción. El guión no es especial para el shell, solo para el comando, por lo que las comillas no lo afectarán. Tiene dos formas de pasar un argumento que comienza con un guión a un comando sin que se interprete como una opción:

  • Encuentre otra forma de expresar este argumento. Para un nombre de archivo, agregar ./al frente todavía designa el mismo archivo.
  • Pon el argumento --antes. Eso le dice al comando que deje de buscar opciones.

Aquí hay algunas formas en que puede cambiar a este subdirectorio:

cd -- '-3ab_&_-3dc.img'
cd -- -3ab_\&_-3dc.img
cd ./-3ab_\&_-3dc.img
cd './-3ab_&_-3dc.img'
Gilles 'SO- deja de ser malvado'
fuente
Gracias. Pensé que también había probado ese formato, pero olvidé escapar del signo (como en su tercer ejemplo). Cuando lo hice, funcionó.
RCinICT
5

El ampersand necesita escapar, pero el problema que está teniendo es probable con el líder -, en lugar del ampersand. El -cd principal hizo pensar que estás pasando opciones. Puede solucionar esto utilizando ./:

cd './-3ab_&_-3dc.img'
jordanm
fuente
El &definitivamente es un problema. En cuanto al -, depende de la cáscara. Zsh está bastante contento cdcon un directorio que comienza con a -. Sin embargo bash no lo es.
Patrick
Gracias. Pensé que también había intentado ese formato, pero olvidé escapar del signo. Cuando lo hice, funcionó.
RCinICT