Escape los nombres de archivo de la misma manera Bash lo hace

Cuando utilizo la tecla “tab” en bash (cuando ha comenzado a escribir el nombre del archivo y desea que se complete), bash escapa el nombre de archivo correctamente, y si uso exactamente ese nombre de archivo “escapado”, funciona.

Por ejemplo:

An-Beat - Mentally Insine (Original Mix).mp3 => Después de bash Escapes usando “TAB” An-Beat\ -\ Mentally\ Insine\ \(Original\ Mix\).mp3

Estoy buscando una función para bash que escape a un nombre de archivo de la misma manera en que “tab” escapa de los nombres de archivo.

Gracias por adelantado.

Use printf (1):

 x='a real \good %* load of c$rap' x=$(printf '%q' "$x") echo $x 

regresará

 a\ real\ \\good\ %\*\ load\ of\ c\$rap 

Voy a detallar la respuesta de Sehe en este caso.

Si desea pasar el argumento para convertirlo como un parámetro de script de shell, coloque el parámetro en “‘s.

 #!/bin/bash x=$(printf '%q' "$1") echo $x 

Me gusta mucho la solución printf, ya que tiene todos los personajes especiales, como bash.

 $ string="An-Beat - Mentally Insine (Original Mix).mp3" $ echo ${string// /\\ } An-Beat\ -\ Mentally\ Insine\ (Original\ Mix).mp3 $ string=${string// /\\ } $ echo ${string//(/\\( } An-Beat - Mentally Insine \( Original Mix).mp3 

La solución de “sehe” funciona bien, además, también puede usar comillas dobles (“) en lugar de un solo apóstrofo (‘) para poder usar variables:

 x="a real \good %* load of crap from ${USER}" echo $(printf '%q' "$x") 

Por supuesto, la cadena no puede contener $ o “sí mismo” o tiene que escapar de los manulally por splash \ $.