Cómo manipular nombres de archivo que tienen espacios y caracteres especiales en Linux


Nos encontramos con archivos y nombres de carpetas con mucha frecuencia. En la mayoría de los casos, el nombre de archivo/carpeta está relacionado con el contenido del archivo/carpeta y comienza con un número y caracteres. Los nombres de archivo alfanuméricos son bastante comunes y muy utilizados, pero este no es el caso cuando tenemos que tratar con nombres de archivos/carpetas que tienen caracteres especiales.

Nota: Podemos tener archivos de cualquier tipo, pero por simplicidad y fácil implementación, trataremos con archivos de texto (.txt), a lo largo del artículo.

Ejemplos de los nombres de archivo más comunes son:

abc.txt
avi.txt
debian.txt
...

Ejemplos de nombres de archivos numéricos son:

121.txt
3221.txt
674659.txt
...

Ejemplos de nombres de archivo alfanuméricos son:

eg84235.txt
3kf43nl2.txt
2323ddw.txt
...

Ejemplos de nombres de archivos que tienen un carácter especial y no son muy comunes:

#232.txt
#bkf.txt
#bjsd3469.txt
#121nkfd.txt
-2232.txt
-fbjdew.txt
-gi32kj.txt
--321.txt
--bk34.txt
...

Una de las preguntas más obvias aquí es: ¿quién en la tierra crea/trata con el nombre de archivos/carpetas que tiene un Hash (#) , un punto y coma (;) , un guión (-) o cualquier otro carácter especial.

Estoy de acuerdo con usted, que tales nombres de archivos no son comunes, pero su shell no debería romperse/rendirse cuando tenga que lidiar con tales nombres de archivos. También hablando técnicamente, todo, ya sea carpeta, controlador o cualquier otra cosa, se trata como archivo en Linux.

Tratar con un archivo que tiene un guión (-) en su nombre

Cree un archivo que comience con un guión (-) , digamos -abx.txt.

$ touch -abc.txt
touch: invalid option -- 'b'
Try 'touch --help' for more information.

La razón del error anterior, ese shell interpreta cualquier cosa después de un guión (-) , como opción, y obviamente no existe tal opción, de ahí el error.

Para resolver tal error, tenemos que decirle al shell Bash (sí, este y la mayoría de los otros ejemplos en el artículo son para BASH) que no interprete nada después del carácter especial (aquí guión), como opción.

Hay dos formas de resolver este error como:

$ touch -- -abc.txt		[Option #1]
$ touch ./-abc.txt		[Option #2]

Puede verificar el archivo así creado por las dos formas anteriores ejecutando los comandos ls o ls -l para una lista larga.

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 11:05 -abc.txt

Para editar el archivo anterior, puede hacer:

$ nano -- -abc.txt 
or 
$ nano ./-abc.txt 

Nota: puede reemplazar nano con cualquier otro editor de su elección, diga vim como:

$ vim -- -abc.txt 
or 
$ vim ./-abc.txt 

De manera similar, para mover dicho archivo, debe hacer:

$ mv -- -abc.txt -a.txt
or
$ mv -- -a.txt -abc.txt

y para Eliminar este archivo, debes hacer:

$ rm -- -abc.txt
or
$ rm ./-abc.txt 

Si tiene muchos archivos en una carpeta cuyo nombre contiene un guión y desea eliminarlos todos a la vez, haga lo siguiente:

$ rm ./-*

1. Se sigue la misma regla que se ha explicado anteriormente para cualquier número de mensajes en el nombre del archivo y su aparición. A saber, -a-b-c.txt, ab-c.txt, abc-.txt, etc.

2. Se sigue la misma regla que se mencionó anteriormente para el nombre de la carpeta que tiene cualquier número de hiperenlaces y su aparición, excepto el hecho de que para eliminar la carpeta debe usar "rm -rf" como:

$ rm -rf -- -abc
or
$ rm -rf ./-abc

Manejo de archivos que tienen HASH (#) en el nombre

El símbolo # tiene un significado muy diferente en BASH. Cualquier cosa después de un # se interpreta como comentario y, por lo tanto, BASH lo ignora.

cree un archivo # abc.txt.

$ touch #abc.txt
touch: missing file operand
Try 'touch --help' for more information.

La razón del error anterior, que Bash está interpretando # abc.txt un comentario y, por lo tanto, lo ignora. Entonces, el comando touch se ha pasado sin ningún operando de archivo, y de ahí el error.

Para resolver dicho error, puede pedirle a BASH que no interprete # como comentario.

$ touch ./#abc.txt
or
$ touch '#abc.txt'

y verifique el archivo recién creado como:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:14 #abc.txt

Ahora cree un archivo cuyo nombre contenga # en cualquier lugar excepto al principio.

$ touch ./a#bc.txt
$ touch ./abc#.txt

or
$ touch 'a#bc.txt'
$ touch 'abc#.txt'

Ejecute "ls -l" para verificarlo:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:16 a#bc.txt
-rw-r--r-- 1 avi avi 0 Jun  8 12:16 abc#.txt

Qué sucede cuando crea dos archivos (digamos ay #bc) a la vez:

$ touch a.txt #bc.txt

Verifique el archivo que acaba de crear:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:18 a.txt

Obviamente, por el ejemplo anterior, solo se creó el archivo "a" y el archivo "#bc" se ha ignorado. Para ejecutar la situación anterior con éxito podemos hacer,

$ touch a.txt ./#bc.txt
or
$ touch a.txt '#bc.txt'

y verifíquelo como:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 12:20 a.txt
-rw-r--r-- 1 avi avi 0 Jun  8 12:20 #bc.txt

Puede mover el archivo como:

$ mv ./#bc.txt ./#cd.txt
or
$ mv '#bc.txt' '#cd.txt'

Cópialo como:

$ cp ./#cd.txt ./#de.txt
or
$ cp '#cd.txt' '#de.txt'

Puede editarlo usando su elección de editor como:

$ vi ./#cd.txt
or
$ vi '#cd.txt'
$ nano ./#cd.txt
or
$ nano '#cd.txt'

Y eliminarlo como:

$ rm ./#bc.txt 
or
$ rm '#bc.txt'

Para eliminar todos los archivos que tienen hash (#) en el nombre del archivo, puede usar:

 # rm ./#*

Manejo de archivos que tienen punto y coma (;) en su nombre

En caso de que no lo sepa, el punto y coma actúa como un separador de comandos en BASH y quizás también en otro shell. El punto y coma le permite ejecutar varios comandos de una vez y actúa como separador. ¿Alguna vez ha tratado con algún nombre de archivo que tenga punto y coma? Si no aquí lo harás.

Cree un archivo con punto y coma.

$ touch ;abc.txt
touch: missing file operand
Try 'touch --help' for more information.
bash: abc.txt: command not found

La razón del error anterior, es que cuando ejecuta el comando anterior, BASH interpreta touch como un comando pero no pudo encontrar ningún operando de archivo antes del punto y coma y, por lo tanto, informa el error. También informa otro error que indica que el comando "abc.txt" no se encuentra, solo porque después del punto y coma, BASH esperaba otro comando y "abc.txt", no es un comando.

Para resolver tal error, dígale a BASH que no interprete el punto y coma como separador de comando, como:

$ touch ./';abc.txt'
or
$ touch ';abc.txt'

Nota: Hemos incluido el nombre del archivo entre comillas simples . Le dice a BASH que ; es parte del nombre del archivo y no un separador de comandos.

El resto de la acción (es decir, copiar, mover, eliminar) en el archivo y la carpeta que tienen un punto y coma en su nombre se puede llevar a cabo directamente encerrando el nombre entre comillas simples.

Tratar con otros caracteres especiales en el nombre de archivo/carpeta

No requiere nada adicional, simplemente hágalo de manera normal, con un simple nombre de archivo como se muestra a continuación.

$ touch +12.txt 

Debe incluir el nombre del archivo entre comillas simples, como hicimos en el caso del punto y coma. El resto de las cosas son sencillas.

$ touch '$12.txt'

No necesita hacer nada diferente, trátelo como un archivo normal.

$ touch %12.txt

Tener Asterisk en el nombre del archivo no cambia nada y puede continuar usándolo como un archivo normal.

$ touch *12.txt

Nota: Cuando tenga que eliminar un archivo que comience con * , nunca use los siguientes comandos para eliminar dichos archivos.

$ rm *
or
$ rm -rf *

En su lugar use,

$ rm ./*.txt

Simplemente incluya el nombre del archivo entre comillas simples y el resto de las cosas son iguales.

$ touch '!12.txt'

Nada adicional, trate un nombre de archivo que tenga At Sign como un archivo no normal.

$ touch '@12.txt'

No se requiere atención adicional. Utilice un archivo que tenga ^ en el nombre del archivo como archivo normal.

$ touch ^12.txt

El nombre del archivo debe estar entre comillas simples y estará listo para comenzar.

$ touch '&12.txt'

Si el nombre del archivo tiene paréntesis, debe incluir el nombre del archivo entre comillas simples.

$ touch '(12.txt)'

No se necesitan cuidados adicionales. Trátelo como un archivo más.

$ touch {12.txt}

Un nombre de archivo que tenga Chevrones debe ir entre comillas simples.

$ touch '<12.txt>'

Trate el nombre de archivo que tiene corchetes como archivos normales y no necesita cuidarlo más.

$ touch [12.txt]

Son muy comunes y no requieren nada adicional. Simplemente haga lo que hubiera hecho con un archivo normal.

$ touch _12.txt

Tener un signo igual a no cambia nada, puede usarlo como archivo normal.

$ touch =12.txt

La barra invertida le dice a shell que ignore el siguiente carácter. Debe incluir el nombre del archivo entre comillas simples, como hicimos en el caso del punto y coma. El resto de las cosas son sencillas.

$ touch '.txt'

No puede crear un archivo cuyo nombre incluya una barra inclinada (/) hasta que su sistema de archivos tenga un error. No hay forma de escapar de una barra inclinada.

Entonces, si puede crear un archivo como "/12.txt" o "b/c.txt", entonces su sistema de archivos tiene un error o tiene soporte Unicode, lo que le permite crear un archivo con barra inclinada. En este caso, la barra inclinada no es una barra inclinada real, sino un carácter Unicode que se parece a una barra inclinada.

Una vez más, un ejemplo en el que no es necesario realizar ningún intento especial. Un nombre de archivo que tenga un signo de interrogación se puede tratar de la forma más general.

$ touch ?12.txt

Los archivos que comienzan con dot (.) son muy especiales en Linux y se denominan archivos dot. Son archivos ocultos generalmente una configuración o archivos del sistema. Debe usar el interruptor "-a" o "-A" con el comando ls para ver dichos archivos.

La creación, edición, cambio de nombre y eliminación de dichos archivos es sencilla.

$ touch .12.txt

Nota: En Linux, puede tener tantos puntos (.) como necesite en un nombre de archivo. A diferencia de otros puntos del sistema en el nombre del archivo, no significa separar el nombre y la extensión. Puede crear un archivo con varios puntos como:

$ touch 1.2.3.4.5.6.7.8.9.10.txt

y compruébalo como:

$ ls -l

total 0
-rw-r--r-- 1 avi avi 0 Jun  8 14:32 1.2.3.4.5.6.7.8.9.10.txt

Puede tener una coma en un nombre de archivo, tantos como desee y no requiere nada adicional. Simplemente hágalo de manera normal, como un simple nombre de archivo.

$ touch ,12.txt
or
$ touch ,12,.txt

Puede tener dos puntos en un nombre de archivo, tantos como desee y no requiere nada adicional. Simplemente hágalo de manera normal, como un simple nombre de archivo.

$ touch :12.txt
or
$ touch :12:.txt

Para tener comillas en el nombre del archivo, tenemos que usar la regla de intercambio. Es decir, si necesita tener comillas simples en el nombre del archivo, incluya el nombre del archivo con comillas dobles y si necesita tener comillas dobles en el nombre del archivo, escríbalo con comillas simples.

$ touch "15'.txt"

and

$ touch '15”.txt'

Algunos editores en Linux como emacs crean un archivo de respaldo del archivo que se está editando. El archivo de respaldo tiene el nombre del archivo original más una tilde al final del nombre del archivo. Puede tener un archivo cuyo nombre incluya tilde, en cualquier ubicación simplemente como:

$ touch ~1a.txt
or
$touch 2b~.txt

Cree un archivo cuyo nombre tenga un espacio entre carácter/palabra, diga "hola, mi nombre es avishek.txt".

No es una buena idea tener un nombre de archivo con espacios y si tiene que distinguir un nombre legible, debe usar, subrayado o guión. Sin embargo, si tiene que crear un archivo de este tipo, debe usar una barra inclinada hacia atrás que ignora el siguiente carácter. Para crear el archivo anterior tenemos que hacerlo de esta manera.

$ touch hi\ my\ name\ is\ avishek.txt

hi my name is avishek.txt

He intentado cubrir todos los escenarios con los que te puedes encontrar. La mayor parte de la implementación anterior es explícitamente para BASH Shell y es posible que no funcione en otro shell.

Si siente que me perdí algo (que es muy común y de naturaleza humana), puede incluir su sugerencia en los comentarios a continuación. Mantente conectado, sigue comentando. ¡Estén atentos y conectados! ¡Comparte con nosotros y ayúdanos a difundir!