GNU/Linux >> Tutoriales Linux >  >> Linux

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

Nos encontramos con nombres de archivos y carpetas con mucha frecuencia. En la mayoría de los casos, el nombre del 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 se usan mucho, pero este no es el caso cuando tenemos que lidiar 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 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 archivos 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 demonios crea/trata con archivos/carpetas con un nombre Hash (#)? , un punto y coma (;) , un guión (-) o cualquier otro carácter especial.

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

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

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

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

El motivo del error anterior es que el 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 dicho error, tenemos que decirle al shell Bash (sí, este y la mayoría de los otros ejemplos en el artículo son para BASH ) para no interpretar nada después de un 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 

Del mismo modo, para mover dicho archivo, debe hacer:

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

y para Borrar este archivo, tienes que 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 ./-*
Importante a tener en cuenta:

1. La misma regla que se discutió anteriormente sigue para cualquier número de guiones en el nombre del archivo y su aparición. Es decir, -a-b-c.txt , ab-c.txt , abc-.txt , etc.

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

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

Tratar con 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 un comentario y, por lo tanto, BASH lo ignora.

Entenderlo usando ejemplos:

crea un archivo #abc.txt .

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

El motivo del error anterior es que Bash está interpretando #abc.txt un comentario y por lo tanto ignorando. Entonces, el comando touch se pasó sin ningún Operando de archivo y, por lo tanto, es 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 a y #bc ) a la vez:

$ touch a.txt #bc.txt

Verifique el archivo recién creado:

$ ls -l

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

Obvio del ejemplo anterior, solo creó el archivo 'a ‘ y archivo ‘#bc ' ha sido ignorado. Para ejecutar la situación anterior con éxito podemos hacer,

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

y verificarlo 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 ./#*

Tratar con 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 otros shells. El punto y coma le permite ejecutar varios comandos a la vez y actúa como separador. ¿Alguna vez ha tratado con algún nombre de archivo que tenga un punto y coma? Si no aquí lo harás.

Cree un archivo que tenga un punto y coma.

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

El motivo 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 de un error. También informa otro error que 'abc.txt ' comando no encontrado, solo porque después del punto y coma BASH esperaba otro comando y 'abc.txt ', no es un comando.

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

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

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

El resto de la acción (es decir, copiar, mover, eliminar) en el archivo y la carpeta que tiene 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 del archivo/carpeta

Signo más (+) en el nombre del archivo

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

$ touch +12.txt 

Signo de dólar ($) en el nombre del archivo

Debe encerrar 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'

Porcentaje (%) en el nombre del archivo

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

$ touch %12.txt

Asterisco (*) en el nombre del archivo

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

$ touch *12.txt

Nota :Cuando tiene que eliminar un archivo que comienza con * , Nunca use los siguientes comandos para eliminar dichos archivos.

$ rm *
or
$ rm -rf *

En su lugar, use,

$ rm ./*.txt

Signo de exclamación (!) en el nombre del archivo

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

$ touch '!12.txt'

En Sign (@) en el nombre del archivo

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

$ touch '@12.txt'

^ en nombre de archivo

No se requiere atención adicional. Use un archivo que tenga ^ en nombre de archivo como archivo normal.

$ touch ^12.txt

Y comercial (&) en el nombre del archivo

El nombre del archivo debe estar entre comillas simples y ya está listo.

$ touch '&12.txt'

Paréntesis () en el nombre del archivo

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

$ touch '(12.txt)'

Cortes {} en el nombre del archivo

No se necesita cuidado adicional. Simplemente trátelo como un archivo más.

$ touch {12.txt}

Chevrones <> en el nombre del archivo

Un nombre de archivo que tenga Chevrons debe estar entre comillas simples.

$ touch '<12.txt>'

Corchetes [ ] en el nombre del archivo

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

$ touch [12.txt]

Bajo (_) en el nombre del archivo

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

$ touch _12.txt

Igual a (=) en nombre de archivo

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

$ touch =12.txt

Lidiar con la barra invertida (\)

La barra invertida le dice a Shell que ignore el siguiente carácter. Debe encerrar 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'

El caso especial de la barra diagonal

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

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

Signo de interrogación (?) en el nombre del archivo

Nuevamente, un ejemplo en el que no necesita hacer ningún intento especial. Un nombre de archivo que tenga un signo de interrogación se puede tratar de la manera más general.

$ touch ?12.txt

Marca de punto (.) en el nombre del archivo

Los archivos que comienzan con el punto (.) son muy especiales en Linux y se llaman archivos de puntos. Son archivos ocultos generalmente archivos de configuración o de sistema. Tienes que usar el interruptor '-a ' o '-A ' con 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 usted necesita 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 que tenga múltiples 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

Coma (,) en el nombre del archivo

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

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

Dos puntos (:) en el nombre del archivo

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 nombre de archivo simple.

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

Tener comillas (sencillas y dobles) en el nombre del archivo

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, escriba el nombre del archivo entre comillas dobles y si necesita tener comillas dobles en el nombre del archivo, enciérrelo con comillas simples.

$ touch "15'.txt"

and

$ touch '15”.txt'

Tilde (~) en el nombre del archivo

Algunos editores en Linux como emacs crear un archivo de copia de seguridad del archivo que se está editando. El archivo de copia de seguridad 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

Espacio en blanco en el nombre del archivo

Cree un archivo cuyo nombre tenga 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 un nombre legible distinto, debe usar guiones bajos o guiones. 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ía de las implementaciones anteriores son explícitas para BASH Shell y es posible que no funcionen 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. ¡Manténgase sintonizado y conectado! ¡Dale me gusta y compártenos y ayúdanos a difundir!


Linux
  1. Cómo redirigir la salida a un archivo y salida estándar en Linux

  2. Qué es NFS y cómo instalarlo en Linux

  3. Cómo extraer archivos .gz y .tar.gz en Linux

  4. ¿Cómo evitar la modificación, eliminación y cambio de nombre de archivos/directorios en Linux?

  5. Cómo montar y desmontar un sistema de archivos en Linux

Cómo trabajar con enlaces duros y suaves en Linux

Cómo quitar (^M) caracteres de un archivo en Linux

Cómo quitar espacios de los nombres de archivo en Linux

Cómo crear y usar un archivo de intercambio en Linux

Cómo abordar los nombres de archivo con espacios en Linux

¿Cómo cambiar el nombre de todos los archivos con caracteres especiales y espacios en un directorio?