Cómo lidiar con espacios en nombres de archivos en Linux

Cómo lidiar con espacios en nombres de archivos en Linux

Conclusiones clave

Si tiene un nombre de archivo con espacios en un sistema Linux, incluir su nombre de archivo entre comillas permite que Bash lo trate correctamente. La función de tabulación facilita la introducción de nombres de archivos en la línea de comandos, incluso si contienen espacios.

Como la mayoría de los sistemas operativos, Linux admite nombres de archivos con espacios. Pero usar estos nombres de archivos en la línea de comando no siempre es sencillo. A continuación se muestran varias formas de manejar nombres de archivos que contienen espacios.

¿Cómo funcionan los nombres de archivos de Linux?

Todo lo almacenado en el disco duro de su computadora debe tener un nombre. Sin un nombre, no existirían archivos. Todas las aplicaciones y demonios que se inician cuando se inicia su computadora, y todo el software que utiliza, deben identificarse y almacenarse en un sistema de archivos. Esa identificación es el nombre del expediente.

Lo mismo se aplica a los archivos que crea o instala. Todos sus documentos, imágenes y música necesitan nombres de archivo. Sin nombres de archivos, ninguno de sus activos digitales podría existir. Debido a que los nombres de archivos son tan importantes, Linux se esfuerza por imponer la menor cantidad posible de reglas sobre su composición.

En Linux, un nombre de archivo puede contener cualquier carácter además de la barra diagonal “/” y el carácter nulo, 0x00. El carácter nulo se utiliza para marcar el final de una cadena, por lo que no puede estar presente en la cadena misma, o Linux truncaría el nombre del archivo en la posición del carácter nulo. La barra diagonal “/” se utiliza como separador en las rutas de directorio.

Los nombres de archivos distinguen entre mayúsculas y minúsculas y pueden tener hasta 255 bytes de longitud , incluido el carácter nulo. Las rutas de directorio pueden tener hasta 4096 bytes de longitud, incluido el carácter nulo. Tenga en cuenta que esta es su longitud en bytes, lo que puede no equivaler directamente a caracteres. Los caracteres Unicode de 16 bits, por ejemplo, ocupan dos bytes cada uno.

Los entusiastas de la informática retro y aquellos con mucha memoria sabrán que en los primeros días de las computadoras personales, el sistema operativo de disco de Microsoft , DOS, no distinguía entre mayúsculas y minúsculas y tenía un límite de nombre de archivo de ocho caracteres, más una extensión de tres caracteres .

Tenías que ser muy reflexivo y, a veces, creativo al nombrar los archivos. En comparación, la libertad que tenemos hoy significa que podemos nombrar archivos como queramos, sin pensar en nada más que la descripción que estamos creando para ese archivo.

Pero con los nombres de archivos, lo que más a menudo nos hace tropezar no son los caracteres que escribimos, sino los espacios entre ellos.

Por qué los espacios en los nombres de archivos de Linux son una molestia

Shells como Bash interpretarán una cadena de palabras separadas por espacios como argumentos de comando individuales, no como un solo argumento. Aquí hay un ejemplo, usándolo touchpara crear un nuevo archivo llamado «mi nuevo archivo.txt».

touch my new file.txt ls

Intentando usar el toque para crear un archivo con espacios en su nombre

Como podemos ver, lsnos muestra que hay tres archivos creados, uno llamado “mi”, otro llamado “nuevo” y uno más llamado “archivo.txt”.

Tenga en cuenta que touchno se quejó ni arrojó un error. Lleva a cabo lo que cree que le estamos pidiendo que haga. Entonces nos regresa silenciosamente a la línea de comando. Si no estamos motivados para comprobarlo, no sabremos que las cosas no han salido según lo planeado.

Para crear el archivo que queríamos, tenemos que citar o escapar.

Cómo cotizar y escapar de espacios

Si citamos el nombre de archivo completo, touchsabe que debe tratar el texto citado como un único argumento.

touch 'my new file.txt' ls

Usar Touch para crear un archivo con espacios en su nombre, con el nombre completo entre comillas

Esta vez obtenemos el archivo único que esperábamos.

Podemos obtener el mismo resultado si usamos el carácter de barra invertida “ \“para escapar de los espacios. Al “escapar” de los espacios, no se los trata como caracteres especiales (es decir, separadores de argumentos), sino que se los considera espacios antiguos y simples.

touch my\ second\ new\ file.txt ls

Usar el toque para crear un archivo con espacios en su nombre con barras invertidas

Eso funciona, pero escapar de los espacios hace que escribir nombres de archivos sea más lento y propenso a errores. Las cosas pueden ponerse realmente feas si también tienes nombres de directorio con espacios.

cp dir one/my\ text\ file.txt dir\ two/my\ text file.bak ls

Usar espacios de escape en un comando para copiar un archivo de un directorio a otro

Ese comando copia un único archivo de texto de un directorio llamado «dir uno» a un directorio llamado «dir dos» y guarda la copia como un archivo BAK. Y es un ejemplo bastante simple.

Cómo solucionar el problema del espacio desde su origen

Si son sus propios archivos, puede tomar la decisión política de no utilizar nunca espacios y crear (o cambiar el nombre de forma masiva ) nombres de archivos como este.

mynewtextfile.txt

Es cierto que es una solución sólida, pero sigue siendo fea. Hay mejores opciones, como usar guiones “ -“o guiones bajos “ _“para separar las palabras.

my-new-text-file.txt my_new_text_file.txt

Ambos evitarán el problema y son legibles. Si no desea agregar caracteres adicionales a sus nombres de archivos, puede usar CamelCase para que sus nombres de archivos sean legibles, así:

MyNewTextFile.txt

La expansión de pestañas facilita el manejo de espacios

Por supuesto, adoptar una convención de nomenclatura y ceñirse a ella sólo será útil cuando trabaje con sus propios archivos. Es poco probable que los archivos que provienen de otro lugar sigan la convención de nomenclatura adoptada.

Puede utilizar la expansión de pestañas para ayudarle a «completar» con precisión los nombres de archivos para nosotros. Digamos que queremos eliminar el archivo BAK que creamos en el «directorio dos», usando rm.

Comenzamos escribiendo «rm dir» porque estamos usando el rmcomando y sabemos que el nombre del directorio comienza con «dir».

rm dir

Escribir el inicio de un comando, antes de presionar el tabulador para usar la función de finalización con tabulador

Al presionar la tecla «Tab», Bash busca coincidencias en el directorio actual.

Al presionar tabulador se agregó una barra invertida y un espacio a la ruta parcial del directorio.

Hay dos directorios que comienzan con «dir» y en ambos casos el siguiente carácter es un espacio. Entonces Bash agrega el carácter de barra invertida “ \“y un espacio. Bash luego espera a que le proporcionemos el siguiente personaje. Necesita el siguiente carácter para diferenciar entre las dos posibles coincidencias en este directorio.

Escribiremos una “t”, para “dos”, y luego presionaremos “Tab” una vez más.

La ruta del directorio después de escribir

Bash completa el nombre del directorio por nosotros y espera a que escribamos el inicio del nombre del archivo.

Solo tenemos un archivo en este directorio, por lo que escribir la primera letra del nombre del archivo, «m», es suficiente para que Bash sepa qué archivo queremos usar. Al escribir «m» y presionar «Tab» se completa el nombre del archivo y «Entrar» ejecuta el comando completo.

El nombre de archivo completo se completa presionando

La expansión de pestañas facilita la tarea de garantizar que los nombres de archivos sean correctos y también acelera la navegación y la escritura en la línea de comandos en general.

Cómo utilizar nombres de archivos con espacios en scripts Bash

No sorprende que los scripts tengan exactamente los mismos problemas con los espacios en los nombres de archivos que la línea de comando. Si pasa un nombre de archivo como variable, asegúrese de citar el nombre de la variable.

Este pequeño script busca en el directorio actual archivos que coincidan con el patrón de archivo “*.txt” y los almacena en una variable llamada file_list. Se utiliza un bucle for para realizar una acción simple en cada uno.

#!/bin/bashfile_list=*.txtfor file in $file_listdo ls -hl $filedone

Copie este texto en un editor y guárdelo en un archivo llamado «files.sh». Luego use el comando chmod para hacerlo ejecutable.

chmod +x files.sh

Usando chmod para hacer ejecutable el script

Tenemos algunos archivos en este directorio. Uno tiene un nombre de archivo simple y los otros dos usan guiones bajos “ _“o guiones “ -“en lugar de espacios. Esto es lo que vemos cuando ejecutamos el script.

./files.sh

Ejecutar el script files.sh con nombres de archivos que no contienen espacios

Eso parece funcionar muy bien. Pero cambiemos los archivos en el directorio por archivos que contengan espacios en sus nombres.

./files.sh

Ejecutar el script files.sh con nombres de archivos que contienen espacios

Cada palabra en cada nombre de archivo se maneja como si fuera un nombre de archivo en sí mismo, por lo que el script falla. Pero todo lo que necesitamos hacer para que el script maneje espacios en los nombres de archivos es citar la $filevariable dentro del forbucle.

#!/bin/bashfile_list=*.txtfor file in $file_listdols -hl "$file"done

Tenga en cuenta que el signo de dólar “ $“está dentro de las comillas. Hicimos ese cambio y lo guardamos en el archivo de script «files.sh». Esta vez, los nombres de archivos se manejan correctamente.

./files.sh

El script files.sh modificado maneja correctamente archivos con espacios en sus nombres

Espaciado, pero no escamoso

Evitar espacios en tus propios nombres de archivos sólo te llevará hasta cierto punto. Es inevitable que encuentre archivos de otras fuentes con nombres que contengan espacios. Afortunadamente, si necesita manejar esos archivos en la línea de comandos o en scripts, existen formas sencillas de hacerlo.

Comandos de Linux

Archivos

tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · tipo · renombrar · zip · descomprimir · montar · desmontar · instalar · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · parche · convertir · rclone · triturar · srm · scp · gzip · chattr · cortar · buscar · umask · wc · tr

Procesos

alias · pantalla · arriba · nice · renice · progreso · strace · systemd · tmux · chsh · historial · at · lote · gratis · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · tiempo de espera · pared · · matar · dormir · sudo · su · tiempo · agregar grupo · usermod · grupos · lshw · apagar · reiniciar · detener · apagar · contraseña · lscpu · crontab · fecha · bg · fg · pidof · nohup · pmap

Redes

netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *